【发布时间】:2013-11-22 21:32:46
【问题描述】:
如何覆盖 MyNode 类中的 operator() 以便 set::find 可以使用,以及存储 MyNode* 的集合。然后我尝试在集合中找到指针,其数据字段与给定对象中的相同。下面的代码不像我预期的那样工作。我在运算符方法中设置了断点,但没有停止。
我知道我可以在 MyNode 类之外定义 find struct compare{},然后定义如下集合: 集集 这对我来说没问题。在这里,我想知道是否可以在 MyNode 类中定义比较。
我的代码是这样的:
class MyNode {
std::string data;
public:
MyNode();
MyNode(std::string str);
MyNode(const MyNode& orig);
virtual ~MyNode();
std::string getData();
bool operator<(const MyNode& node){
return data<node.data;
}
bool operator<( const MyNode* node){
return data<node->data;
}
};
void testset(){
MyNode* node1 = new MyNode("5S");
MyNode* node2 = new MyNode("AH");
MyNode* node3 = new MyNode("AH");
std::cout<<" "<<node2<<std::endl;
std::set<MyNode*> sets;
sets.insert(node1);
sets.insert(node2);
std::set<MyNode*>::iterator iter =sets.find(node3); // I expected node2 can be found, but it does not..
if(iter != sets.end()){
MyNode* no = *iter;
std::cout<<"find it "<<no<<std::endl;
}
}
另一个问题是我是否只定义了这样的集合:
set<MyNode> sets.
std::find(sets.begin(), sets.end(), findmethod("aa"))
这个复杂度是 O(N) 还是 O(log N)?
【问题讨论】:
-
在
std::set中搜索一个元素是 O(log N)。 -
@MarcClaesen 是吗?该标准要求它与设定的大小成对数。使用 algorithm
std::find而不是 containerstd::set<T>::find确实是线性的,这可能就是您的意思。不确定。 -
@WhozCraig 我的意思是
std::set<T>::find。我想我不够具体。 -
@MarcClaesen 是的,那个不是 O(n),而是 O(log(n)) 每个标准。泛型
std::find将是 O(n) 仅仅是因为它通过前向迭代器进行枚举。如果搜索一个集合,使用std::set<T>::find显然更好,它利用集合使用的任何内部数据结构(通常是 RB 树)来提供所需的对数复杂度。