代码之家  ›  专栏  ›  技术社区  ›  Geek

向量相交

  •  2
  • Geek  · 技术社区  · 7 年前

    我几乎没有向量。对于eg 4

    std::vector1 <CMyClass>;
    std::vector2 <CMyClass>;
    std::vector3 <CMyClass>;
    std::vector4 <CMyClass>;
    

    我想要一个得到的向量,这个向量中有一个物体。

    Vector1 has C1, C2, C3;
    Vector2 has C1, C2;
    Vector3 has C1, C4;
    Vector has  C1, C5;
    

    我希望得到的向量有C1。

    像一些运算符或数据结构。

    3 回复  |  直到 7 年前
        1
  •  2
  •   Ajay    4 年前
    1. std::set_intersection() 三倍(等于您拥有的向量数量-1)。

    时间复杂度分析:

    • 4*O(nlogn)=O(nlogn)
    • 线性2*(firstSecondInterSize+thirdSize)-1
    • 线性2*(第一个第二个第三个中间尺寸+第四个尺寸)-1


    完整代码示例:

    #include <iostream>     // std::cout
    #include <algorithm>    // std::set_intersection, std::sort
    #include <vector>       // std::vector
    
    int main () {
      std::vector<int> first = {5,10,15,20,25};
      std::vector<int> second = {50,40,30,20,10};
      std::vector<int> third = {10,20,3,4,0};
      std::vector<int> fourth = {4,20,10,3,6};
      std::vector<int> v(first.size() + second.size() + third.size() + fourth.size());
      std::vector<int>::iterator it;
    
      std::sort (first.begin(),first.end());
      std::sort (second.begin(),second.end());
      std::sort (third.begin(),third.end());
      std::sort (fourth.begin(),fourth.end());
    
      it=std::set_intersection (first.begin(), first.end(), second.begin(), second.end(), v.begin());
      it=std::set_intersection (v.begin(), v.end(), third.begin(), third.end(), v.begin());
      it=std::set_intersection (v.begin(), v.end(), fourth.begin(), fourth.end(), v.begin());
      v.resize(it-v.begin());
    
      std::cout << "The intersection has " << (v.size()) << " elements: ";
      for (it=v.begin(); it!=v.end(); ++it)
        std::cout << ' ' << *it;
      std::cout << '\n';
    
      return 0;
    }
    

    交叉点有2个元素:10 20

        2
  •  0
  •   Useless    7 年前

    十字路口 ,不是 超集

    如果可以对向量进行排序,直接的方法是使用 std::set_intersection .

    你必须使用它三次,才能得到中间结果 A=交叉点(v1,v2) B=交点(3,4) 在获得最终结果之前 .

    使用此 linked answer

        3
  •  0
  •   Andrej Shirinkin    7 年前

    这个怎么样?您必须添加运算符<()在您的类中(和辅助运算符<())。从每个向量集合,然后计算这些集合的交集。再次-从结果集生成向量。

    #include <iostream>
    #include <vector>
    #include <algorithm>
    #include <iostream>
    #include <set>
    
    class CMyClass
     {
     public:
         CMyClass(int n){_n=n;}
         ~CMyClass(){}
         bool operator<(const CMyClass a) const{return _n <a._n;}
         friend std::ostream& operator<<(std::ostream& s,const CMyClass& a){s<<a._n;return s;}
     private:
         int _n;
     };
    vector<CMyClass> find_intersect(vector<vector<CMyClass>>& vecs)
    {
        vector<CMyClass> res;
        if (vecs.empty()) return res;
        set<CMyClass> S;
        for_each(vecs[0].begin(),vecs[0].end(),[&S](const CMyClass& e){S.insert(e);});
        for(auto &vec:vecs)
        {
            set<CMyClass> s,tmp;
            for_each(vec.begin(),vec.end(),[&s](const CMyClass& e){s.insert(e);});
            set_intersection(S.begin(),S.end(),s.begin(),s.end(),std::inserter(tmp,tmp.begin()));
            S=tmp;
            if (S.empty()) break;
        }
        for_each(S.begin(),S.end(),[&res](const CMyClass& e){res.push_back(e);});
        return res;
    }
    
    int main()
    {
        vector<CMyClass> v1={1,2,3};
        vector<CMyClass> v2={1,2};
        vector<CMyClass> v3={1,4};
        vector<CMyClass> v4={1,5};
        vector<vector<CMyClass>> vectors;
        vectors.push_back(v1);
        vectors.push_back(v2);
        vectors.push_back(v3);
        vectors.push_back(v4);
        auto res = find_intersect(vectors);
        cout<<"[";
        for(auto &elem:res)
            cout<<elem<<",";
        cout<<"]"<<endl;
    }
    

    输出: [1,]