【问题标题】:How to get identical pairs from two vectors in c++如何从c ++中的两个向量中获取相同的对
【发布时间】:2015-11-30 15:10:05
【问题描述】:

我定义了两个向量: std::vector<std::pair<int, int> > vec1std::vector<std::pair<int, int> > vec2

我想从vec1vec2 中找到相同的配对。 例如vec1 = {{1,2}, {1,9}, {2,13}, {3,5}}, vec2 = {{8, 7}, {4,2}, {2,10}, {1,9}}。那么结果应该是{{1,9}}

我该怎么做?

【问题讨论】:

    标签: c++ c++11


    【解决方案1】:

    如果您使用std::sort 对向量进行排序,然后使用std::set_intersection 按以下方式查找它们的共同元素,则可以做到这一点:

    std::vector<std::pair<int, int>> v1 {{1,2}, {1,9}, {2,13}, {3,5}};
    std::vector<std::pair<int, int>> v2 {{8,7}, {4,2}, {2,10} ,{1,9}};
    
    std::sort(v1.begin(), v1.end());
    std::sort(v2.begin(), v2.end());
    
    std::vector<std::pair<int, int>> v_intersection;
    std::set_intersection(v1.begin(), v1.end(), v2.begin(), v2.end(),
                          std::back_inserter(v_intersection));
    

    LIVE DEMO

    【讨论】:

      【解决方案2】:

      answer by 42 对两个向量的排序过程的运行时间为 O(n*log(n))(其中n 是较大向量的大小)。如果这是一个问题,您还可以创建一个unordered_set 并用一个向量的元素填充它,然后使用copy_if 仅保留另一个向量中也包含在set 中的元素,结果在 O(n) 的运行时间内。

      struct pairhash {
          template <typename T, typename U>
          std::size_t operator()(const std::pair<T, U>& p) const {
              return std::hash<T>()(p.first) ^ std::hash<U>()(p.second);
          }
      };
      struct pairequal {
          template <typename T, typename U>
          bool operator()(const std::pair<T, U>& p0, const std::pair<T, U>& p1) const {
              return (p0.first == p1.first) && (p0.second == p1.second);
          }
      };
      
      void findEqualPairs() {
          std::vector<std::pair<int, int>> vec1{ { 1, 2 }, { 1, 9 }, { 2, 13 }, { 3, 5 } };
          std::vector<std::pair<int, int>> vec2{ { 8, 7 }, { 4, 2 }, { 2, 10 }, { 1, 9 } };
      
          std::unordered_set<std::pair<int, int>, pairhash, pairequal> set2(
              vec2.begin(), vec2.end());
          std::vector<std::pair<int, int>> intersection;
          std::copy_if(vec1.begin(), vec1.end(),
              std::back_inserter(intersection),
              [&](const std::pair<int, int>& p) { 
                  return set2.find(p) != set2.end(); });
      
          std::cout << "intersection:" << std::endl;
          for (auto it : intersection) {
              std::cout << it.first << ", " << it.second << std::endl;
          }
      }
      

      pairhash 取自 this answer

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-16
        • 2011-01-18
        相关资源
        最近更新 更多