在C ++中查找向量

时间:2015-05-29 22:06:08

标签: c++ c++11 vector

我有两个vector<unsigned>向量,即:vector<vector<unsigned> > sbp, vector<vector<unsigned> > sp。我想在sbp中打印所有那些也在sp中的向量。向量sbpsp都存储(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)

1 个答案:

答案 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";});
}

Live Example

如果项目数量很大,并且数据很可能包含重复项,那么可以使用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()));
相关问题