使用 2D 矢量 (std::vector) 查找 c++ 中的重复条目
To find duplicate entry in c++ using 2D Vector (std::vector)
我编写了一个程序来查找表中的重复条目。我是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";
如果您需要速度(以内存为代价),请将主数据库切换到映射,例如:
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
从未使用过,可以省略。
标准::地图对字符串键具有哈希函数专用化,并且可能是比你我用手鞭打的任何东西都要快几个数量级。
以上所有假设都包含正确的标头,并且
using namespace std;
如果您不喜欢using namespace
,请在所有正确的位置
前面加上std::
希望对:)有所帮助
- 分段故障(堆芯转储)矢量
- 为什么在popback()操作之后,它仍然打印完整的矢量
- 将二维矢量传递给类
- 读取文件并输入到矢量中
- 将Integer转换为4字节的unsined字符矢量(按大端字节顺序)
- 无法通过空白将文本文件行分隔为矢量
- C++-试图将函数指针推回到另一个CPP文件中的矢量时出错
- 正在将csv文件读取为双精度矢量
- 如何将两个不同矢量的同一位置的两个元素组合在一起
- 如何通过 getter 函数删除矢量的元素?
- 如何在C++中将数组转换为矢量指针
- 在C++中将矢量转换为嵌套地图
- C++矢量迭代
- 从矢量<无符号字符>转换为字符* 包括垃圾数据
- 将矢量<T>转换为矢量<数组<T>>
- 指针或结构的矢量
- 为什么文件名被设置为一个点,而不是在读取矢量中的文件名时
- 用于矢量处理的多个线程
- 反向矢量3
- cmath抛出错误C2062、C2059、C2143和C2447.cmath包含在矢量文件中