我有两个vector<unsigned>
向量,即:vector<vector<unsigned> > sbp, vector<vector<unsigned> > sp
。我想在sbp中打印所有那些也在sp
中的向量。向量sbp
和sp
都存储(i)首先按大小; (ii)当尺寸相等时,则按字典顺序对矢量进行排序。我写了以下代码来做同样的事情。代码似乎给出了分段错误。我调试了代码(通过打印输出值),但我无法找到错误的来源。
有人可以帮我找一下可能是分段错误的来源。此外,如果有一些比这更快的算法,那将是非常好的
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
vector<vector<unsigned> > sbp;
vector<vector<unsigned> > sp;
vector<vector<unsigned> >::iterator itSP=sp.begin();
for(vector<vector<unsigned> >::iterator itSbp=sbp.begin(),lSbp=sbp.end();itSbp!=lSbp;)
{
if(std::lexicographical_compare(((*itSbp)).begin(), ((*itSbp)).end(), (*itSP).begin(), (*itSP).end()))
{
itSbp++;
}else{
if((*itSbp)==(*itSP))
{
// cout<<(*itSbp)<<"\n";
itSbp++;
}else{
itSP++;
}
}
}
}
我正在使用C ++ 11(gcc 4.8)
答案 0 :(得分:2)
我想在sbp中打印所有那些也在sp。
中的矢量
每当您想要整理两个容器中的常用值时,应该立即想到的算法是std::set_intersection
。
需要注意的是std::set_intersection
要求容器包含已排序的值(或者提供描述排序顺序的仿函数)。但是,如果您符合该标准,则解决方案很简单。
以下是一个例子:
#include <vector>
#include <iostream>
#include <algorithm>
#include <iterator>
using namespace std;
int main()
{
// test data
vector<vector<unsigned> > sbp = { { 1, 2, 3, 4, 6, 7 }, { 1, 2, 3, 6, 7 }, { 2, 3, 4, 6, 7 }};
vector<vector<unsigned> > sp = { { 1, 2, 3, 4, 6, 7 }, { 1, 2, 3, 4, 6, 7, 8 }, { 2, 3, 4, 6, 7 }};
// resulting vector
vector<vector<unsigned> > result;
// get the intersection of the two values
set_intersection(sbp.begin(), sbp.end(), sp.begin(), sp.end(), back_inserter(result));
// output the results
for_each(result.begin(), result.end(), [](const std::vector<unsigned>& v)
{copy(v.begin(), v.end(), ostream_iterator<unsigned>(cout, " ")); cout << "\n";});
}
如果项目数量很大,并且数据很可能包含重复项,那么可以使用std::set
来存储数据。
// resulting vector
std::set<vector<unsigned>> result;
// get the intersection of the two values
set_intersection(sbp.begin(), sbp.end(), sp.begin(), sp.end(), std::inserter(result, result.begin()));