Я написал программу для поиска повторяющейся записи в таблице. Я новичок в 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);
}
}
}
}
Если вы хотите избежать дублирования записей в массиве, вам следует вместо этого использовать std::set
.
То, что вы хотите, вероятно, является std :: map или std :: set
Не изобретайте велосипед, STL полна лакомства.
Вы, кажется, укоренены в слабо типизированном языке, но 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::
во все нужные места
Надеюсь, поможет :)