Чтобы найти повторяющуюся запись в C ++, используя 2D Vector (std :: vector)

0

Я написал программу для поиска повторяющейся записи в таблице. Я новичок в C++, поэтому я не знаю, как эта программа работает эффективно. Есть ли другая идея написать эту программу? Здесь у меня есть 3 таблицы (2D-вектор), что они 1) aRecord_arr 2) mainTable и 3) idxTable. idxtable используется для идентификации ключей для проверки повторяющейся записи. таблицу aRecord_arr для добавления в maintable. Если он уже существует в maintable, он покажет ошибку "Дублировать запись". Итак, проверьте эту программу и дайте свои предложения.

typedef vector<string> rec_t;
typedef vector<rec_t> tab_t;
typedef vector<int> cn_t;
int main()
{
    tab_t aRecord_arr=  { {"a","apple","fruit"},
                          {"b","banana","fruit"} };

    tab_t mainTable =   { {"o","orange","fruit"},
                          {"p","pineapple","fruit"},
                          {"b","banana","fruit"},
                          {"m","melon","fruit"},
                          {"a","apple","fruit"},
                          {"g","guava","fruit"} };

    tab_t idxTable = { {"code","k"},
                       {"name","k"},
                       {"category","n"}};

    size_t Num_aRecords = aRecord_arr.size();
    int idxSize = idxTable.size();
    int mainSize = mainTable.size();

    rec_t r1;
    rec_t r2;
    tab_t t1,t2;
    cn_t idx;

    for(int i=0;i<idxSize;i++)
    {
        if(idxTable[i][1]=="k")
        {
            idx.push_back(i);               
        }
    }

    for(size_t j=0;j<Num_aRecords;j++)
    {
        for(unsigned int id=0;id<idx.size();id++)
        {
            r1.push_back(aRecord_arr[j][idx[id]]);
        }
        t1.push_back(std::move(r1));
    }

    for(int j=0;j<mainSize;j++)
    {
        for(unsigned int id=0;id<idx.size();id++)
        {
            r2.push_back(mainTable[j][idx[id]]);
        }
        t2.push_back(std::move(r2));
    }

    for(size_t i=0;i<t1.size();i++)
    {
        for(size_t j=0;j<t2.size();j++)
        {
            if(t1[i]==t2[j])
            {
                cout<<"Duplicate Entry"<<endl;
                exit(0);
            }
        }

    }
}
  • 0
    Какой у Вас вопрос? Ваш код не работает? Или это просто медленно? Или вы просите альтернативные методы?
  • 0
    Мне нужен альтернативный метод. У меня вопрос, эта программа эффективна или нет?
Теги:
vector
stdvector

3 ответа

2

Если вы хотите избежать дублирования записей в массиве, вам следует вместо этого использовать std::set.

  • 0
    Вы перефразировали это так, что это больше похоже на ответ. Это совершенно нормально со мной. :-)
  • 0
    Хорошо ; Я здесь новичок, так что я все еще учусь; спасибо, я буду иметь это в виду :-)
1

То, что вы хотите, вероятно, является std :: map или std :: set
Не изобретайте велосипед, STL полна лакомства.

0

Вы, кажется, укоренены в слабо типизированном языке, но C++ строго типизирован.
Вы "заплатите" за недостаток сильной типизации почти независимо от того, что вы делаете, но вы почти тщательно избегаете преимущества.

Позвольте мне начать с поля, которое всегда говорит "фрукты" - мое предложение состоит в том, чтобы сделать это перечислением, например:

enum PlantType { fruit, veggie };

Во-вторых, у вас есть вектор, который всегда содержит 3 строки, все с одинаковым значением. это похоже на работу для структуры, например:

struct Post {
    PlantType kind;
    char firstchar;
    string name;
    // possibly other characteristics
};

"firstchar", вероятно, является преждевременной оптимизацией, но позволяет сохранить это на данный момент.

Теперь вы хотите добавить новое сообщение в существующий вектор сообщений, например:

vector<Post> mainDB;

bool AddOne( const Post& p )
{
    for( auto& pp : mainDB )
        if( pp.name == p.name )
            return false;
    mainDB.push_back(p);
    return true;
}

Теперь вы можете использовать его так:

if( ! AddOne( Post{ fruit, 'b', "banana" } ) )
    cerr << "duplicate entry";


Если вам нужна скорость (за счет памяти), переключите mainDB на карту, например:

map<string,Post> mainDB;

bool AddOne( const Post& p )
{
    if( mainDB.find(p.name) != mainDB.end() )
        return false;
    mainDB[p.name]=p;
    return true;
}

это также облегчает (и быстрее) поиск и использование определенного сообщения, например

cout << "the fruit is called " << mainDB["banana"].name ;

будьте осторожны, что приведенное выше приведет к ошибке выполнения, если пост не существует

Как вы можете видеть, firstchar никогда не использовался и может быть опущен.
std :: map имеет специальную функцию хэш-функции для строковых ключей, и она, вероятно, будет на порядок быстрее, чем все, что вы или я можем взломать вручную.

Все вышеперечисленное предполагало включение правильных заголовков и

using namespace std;

если вам не нравится using namespace, добавьте std:: во все нужные места
Надеюсь, поможет :)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню