Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在两个向量之间找到相同元素的最有效方法是什么_C++ - Fatal编程技术网

C++ 在两个向量之间找到相同元素的最有效方法是什么

C++ 在两个向量之间找到相同元素的最有效方法是什么,c++,C++,如果我必须使用下面的字符向量 vector<char> sv; sv.push_back('a'); sv.push_back('b'); sv.push_back('c'); sv.push_back('d'); sv.push_back('e'); vectorsv; sv.推回(“a”); sv.推回(“b”); sv.推回(“c”); sv.推回(“d”); sv.推回(“e”); 然后我有另一个字符向量,它有sv之前包含的部分元素 vector<char>

如果我必须使用下面的字符向量

vector<char> sv;
sv.push_back('a');
sv.push_back('b');
sv.push_back('c');
sv.push_back('d');
sv.push_back('e');
vectorsv;
sv.推回(“a”);
sv.推回(“b”);
sv.推回(“c”);
sv.推回(“d”);
sv.推回(“e”);
然后我有另一个字符向量,它有sv之前包含的部分元素

vector<char> sv2;
v2.push_back('c');
v2.push_back('d');
v2.push_back('a');
v2.push_back('f');
v2.push_back('g');
向量sv2;
v2.推回(“c”);
v2.推回(“d”);
v2.推回(“a”);
v2.推回(“f”);
v2.推回(“g”);
如果我想计算同一元素出现的次数,那么解决这个问题的最佳方法是什么?

对于
向量
,它可以在线性时间内完成。为了简单起见,我们假设
char
是无符号的,或者我们使用
vector

ints[256]={0},s2[256]={0};
用于(自动a:sv)
++s[a];
用于(自动a:sv2)
++s2[a];
整数计数=0;
对于(int i=0;i<256;++i)
计数+=min(s[i],s2[i]);

在一般情况下使用排序和<代码> SETION交叉,作为<强> >JAROD42建议。

是向量排序?排序和STD::SETIX交叉。考虑如果它是unSundidif,你不能修改<代码> SV < /C> >和<代码> Sv2< /Cord>,创建排序副本。您还可以尝试线性复杂度方法,并对这两种方法进行基准测试。
int s[256] = { 0 }, s2[256] = { 0 };
for (auto a : sv)
   ++s[a];
for (auto a : sv2)
    ++s2[a];
int count = 0;
for (int i = 0; i < 256; ++i)
    count += min(s[i], s2[i]);