我写了一个程序来查找表中的重复条目。我是C++
的初学者,因此我不知道这个程序是如何有效运作的。有没有其他想法写这个程序?这里我有3个表(2D矢量),它们是1)aRecord_arr
2)mainTable
和3)idxTable
。 idxtable
用于标识检查重复条目的密钥。要在aRecord_arr
中添加的maintable
表。如果maintable
中已存在,则会显示错误" Duplicate Entry"。所以检查这个程序,并提出你的建议。
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 :(得分:2)
如果您想避免数组中的重复条目,您应该考虑改为使用std::set
。
答案 1 :(得分:1)
你想要的可能是std :: map或std :: set
不要重新发明轮子,STL充满了好吃的东西。
答案 2 :(得分:0)
你似乎植根于一种弱类型的语言 - 但是C ++是强类型的。
你会支付&#39;几乎无论你做什么,强打字的缺点,但你几乎煞费苦心地避免这种优势。
让我从一开始就说“水果”的领域开始吧。 - 我的建议是把它作为枚举,如:
enum PlantType { fruit, veggie };
其次,你有一个总是包含3个字符串的向量,所有字符串都具有相同的含义。这似乎是一个结构的工作,如:
struct Post {
PlantType kind;
char firstchar;
string name;
// possibly other characteristics
};
&#39; firstchar&#39;可能是过早优化,但我们暂时保留它。
现在,您要将新帖子添加到现有的帖子向量中,例如:
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,例如:
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::
添加到所有正确的位置
希望它有所帮助:)