C++ 在两个向量中匹配变量,并以有效的方式绘制比较图

C++ 在两个向量中匹配变量,并以有效的方式绘制比较图,c++,C++,我已经编写了一些代码来匹配两个向量对象,这两个向量中都有一些相同的对象实例 其思想是在“主”向量中找到对象的索引,并将其与另一个向量的对象相匹配 然后,主向量的索引将用于具有该对象的地图中 我认为查看代码可以让我的解释更清楚一些: ifndef OBJECTMAPMATCH_H #define OBJECTMAPMATCH_H #include <map> #include <utility> #include <vector> #include <t

我已经编写了一些代码来匹配两个向量对象,这两个向量中都有一些相同的对象实例

其思想是在“主”向量中找到对象的索引,并将其与另一个向量的对象相匹配

然后,主向量的索引将用于具有该对象的地图中

我认为查看代码可以让我的解释更清楚一些:

ifndef OBJECTMAPMATCH_H
#define OBJECTMAPMATCH_H

#include <map>
#include <utility>
#include <vector>
#include <typeinfo>
#include <iostream>
#include <stdlib.h>

namespace ObjectMapMatch {

  ...
  ...
  template< class A, class B >
    std::map<int, B*>*  getIndexMap( std::vector<A*>* x , std::vector<B*>* y,  std::map<int, B*>* output )
     {
      typename std::vector<A*>::iterator Aitr  = x->begin();
      typename std::vector<A*>::iterator AitrE = x->end();
      typename std::vector<B*>::iterator Bitr  = y->begin();
      typename std::vector<B*>::iterator BitrE = y->end();

      for(int index=0; Aitr!=AitrE; ++Aitr, ++index){
        //Keep track of original index
        int AntupIndex = (*Aitr)->Index();
        int match = false;

        for(; Bitr!=BitrE; ++Bitr){
           int BntupIndex = (*Bitr)->Index();

           if( AntupIndex == BntupIndex ){
              match = true;
              output[index] = (*Bitr);
            }
           } //End of loop B

           if(!match){
             std::cout << "ERROR:ObjectMapMatch::getIndexMap: Can not Find Match" <<  typeid(y).name() << " FOR " << typeid(x).name() << std::endl;
             exit(1);
            }

           }//End of Loop A

          }

   ...
   ...
}
#endif
而且

使用STL算法(不能使用boost libs)或其他更智能的方法,上述代码是否有更短/更高效的方法


Mike有两种方法比O(n^2)更有效地实现这一点

例如:

  • 对第一个向量的元素进行排序
  • 对第二个向量的元素进行排序
  • 在排序向量上使用
    设置交点
或:

  • 两个向量的元素放入
    多集
    (或
    无序的多集
  • multiset
    中有多个元素的键表示匹配

对于这两种方法,可以在原始向量中使用指针或索引,而不是实际的元素。只需小心提供能够处理指针/索引的比较器(对
进行排序
设置交集
多集
)。

@perreal-是的,这会起作用-关于匹配这些对象的STL效率解决方案的任何想法。循环解决方案很难看…一般注意:你应该通过引用传递对象,而不是C++中的指针。它简化了语法,并清楚地表明接收者对生命周期没有责任。在不修改对象的地方,也应该使用const。大多数C++库都是针对const的正确性设计的,并且将作为const的对象,所以您的代码将不工作。在上面的例子中,方法应该是代码> STD::MAPnconst和GETRealXMmap(STD::向量const & x,STD::vector const & y,STD::MAP/Outlook)< /C> >并且操作符必须是<代码> BoOL运算符==(object1 const&lhs,object2 const&rhs)。后者是因为标准库将在常量引用上调用它,因此使用非常量的运算符将不匹配。当然,如果未使用
const
修饰符定义
Index
方法,则此类
运算符==
将不会编译(发票的常量在参数列表之后)@Jan谢谢你的评论。我同意此代码中应该添加常量正确性!但是,我在通过引用传递时遇到的一个问题是,当这些对象位于堆上时,使用了如此新的对象。然后我需要取消引用指针,然后通过引用传递它。如果我需要进行深度复制,这可能会变得混乱。有什么想法吗??@MWright:您应该使用引用将对象传递给这样的函数。如果对象有单独分配的部分,它们可能仍将作为指针存储,并且对象将作为指针存储在大多数数据结构中。但是在不需要指针功能的情况下(就像这个函数只看这两个向量,不保留它们,修改它们等等),您应该使用reference来表示您不使用指针功能。习惯它需要一些时间,但最终它会使查看代码更容易。两个向量都是以相同的条件排序的。我不确定set_intersection如何处理我的问题,因为我想将向量a的索引存储到映射[int,B]这就是为什么我知道向量A中的哪个对象号指的是向量B中的对象。如果不是,对不起clear@MWright:然后,您必须将索引写入排序结构。但我强烈怀疑,需要索引是调用链上某个更高位置的次优设计的标志。事实上,整个问题看起来可能是这样的使用次优数据结构。@Jan我需要索引的原因是在代码后面引用它,但我同意我应该重新考虑这种方法。谢谢Jan
bool operator==(object1& lhs, object2& rhs){
   &lhs == &rhs ? return true : return false;
}