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;
}