Как перезаписать operator() внутри класса MyNode, чтобы он мог использовать set :: find, и набор, в котором хранится MyNode *. Затем я пытаюсь найти указатель в наборе, поле данных которого совпадает с данным объектом. Следующий код не работает, как я ожидал. Я установил точки останова в методе оператора, но никто не остановился.
Я понимаю, что могу определить find struct compare {} вне класса MyNode, а затем определить такие наборы, как: set sets. Это для меня oK. Здесь мне интересно, можно ли определить сравнение внутри класса 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
не заботится о operator()()
; он заботится о operator<()
.
Что касается вашего второго вопроса: алгоритм std::find
, в отличие от метода std::set<T>::find
, является O (n).
set<MyNode *>
не set<MyNode>
. Вам нужно будет указать свой собственный компаратор, если вы хотите set
сравнение MyNode *
другим способом.
std::set
- это O (log N).std::find
вместо контейнераstd::set<T>::find
действительно линейно, что может быть тем, что вы имели в виду. Точно сказать не могу.