我需要找一个vector<vector<unsigned> > containerVec
;存在于iterate over vector<vector<unsigned> > containerVec
;。一种方法是# iptables -I INPUT -m state –state NEW -m tcp port 80 -j ACCEPT
;并查看containerVec中是否存在searchVec。是否有任何c ++函数的构建可以帮助我做同样的事情。
此外,我的searchVec大小为100万个载体
例如,如果我的searchVec是(9,28,4,2) 我的containerVec是((1,3,678,27),(9,28,4,2),(595,85,52))。然后searchVec(9,28,4,2)存在于((1,3,678,27),(9,28,4,2),(595,85,52))中。但是,如果我的searchVec是(23,84,25,11),那么它就不存在于containerVec中。
编辑:我试过std :: find但是perf工具显示需要花费最多的时间。是否有其他我可以使用的数据结构。这不重复。正如我在我的问题中提到的那样,std :: find表现不佳。你所标记的副本也无法谈论性能问题
答案 0 :(得分:2)
使用STL查找功能。
请记住,还有一个find_if函数,如果您的搜索更复杂,可以使用它,例如,如果您不只是查找元素,但是,例如,想要查看是否存在元素满足某个条件,例如,以“abc”开头的字符串。 (find_if会给你一个指向第一个这样元素的迭代器。)
答案 1 :(得分:2)
当包含的元素具有可比性时,向量比较按字典顺序。因此vector<unsigned>
获取 free 的比较函数(除非您想指定不同的行为)。在following demo中,您可以看到std::find
可以使用vector<unsigned>
#include <iostream>
#include <vector>
#include <algorithm>
int main()
{
std::vector<unsigned> v1{ 1, 2, 3 };
std::vector<unsigned> v2{ 1, 2, 3 };
std::vector<unsigned> v3{ 3, 4 };
std::cout << (v1 == v2) << std::endl;
std::cout << (v1 < v3) << std::endl;
std::cout << (v3 < v2) << std::endl;
std::vector<std::vector<unsigned>> vv { v1, v2, v3 };
auto it = std::find(vv.begin(), vv.end(), v3);
if (it != vv.end())
{
std::cout << "I found v3, it has the following elements\n";
for (auto &&a : *it)
{
std::cout << a << std::endl;
}
}
}
答案 2 :(得分:0)
使用containervec交叉反转searchvec,
en.wikipedia.org/wiki/Cross-correlation
这可以像这里显示的那样完成:
Pattern recognition with double vectors
这将为您提供containervec与searchvec的比较部分的相似性。