STL установить найти производительность

0

Как перезаписать 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)?

  • 0
    Поиск элемента в std::set - это O (log N).
  • 0
    @MarcClaesen MarcClaesen это так? Стандарт требует, чтобы он был логарифмическим по отношению к установленному размеру. Использование алгоритма std::find вместо контейнера std::set<T>::find действительно линейно, что может быть тем, что вы имели в виду. Точно сказать не могу.
Показать ещё 2 комментария
Теги:
set
find
stl

1 ответ

2

Что касается первого вопроса: std::set не заботится о operator()(); он заботится о operator<().

Что касается вашего второго вопроса: алгоритм std::find, в отличие от метода std::set<T>::find, является O (n).

  • 0
    Я обновил класс MyNode с помощью оператора <method, но он все еще не может установить ..find () все еще не может получить node2. Есть ли что-то не так? sets.find () - это O (Log N), независимо от того, есть ли имя в наборе, а std :: find () - это O (N).
  • 0
    Ну, вы храните set<MyNode *> не set<MyNode> . Вам нужно будет указать свой собственный компаратор, если вы хотите set сравнение MyNode * другим способом.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню