Какой оператор нужно переопределить, чтобы использовать std :: set в коде C ++?

Это вопрос интервью.

Referring to the sample code, which one of the operators needs to be overridden in order to use std::set<Value>

 #include<iostream>

 class Value
 {
      std::string   s_val;
      int           i_val;
  public:
      Value(std::string s, int i): s_val(s) , i_val(i){}
 };

 // EOF

 /*
 a       operator !=
 b       operator >
 c       operator <=
 d       operator >=
 e       operator <
 */

На самом деле, я не понимаю, почему оператор должен быть переопределен здесь. & Quot; установить & Quot; не допускает дублирование элементов, может быть, оператор! = должен быть переопределен?

 650203 июн. 2012 г., 19:10
Превосходноoperator!= (илиoperator==) вам сложно поддерживать гарантии сложности, не так ли? Тем не менее я нахожу этот вопрос довольно грустным ...
 Walter03 июн. 2012 г., 19:53
-1, поскольку вы, похоже, не пытались выяснить, что такое и что делает std :: set.

Ответы на вопрос(4)

operator< для вашего типа. Реализация должна следовать за Слабый порядок для возможности использования с ассоциативными контейнерами из стандартной библиотеки, такими какstd::set а такжеstd::map.

Читать о

Строгий Слабый Заказ

Пример здесь:

std составной ключ карты

Набор хранит дубликаты без необходимостиoperator= илиoperator!= используя понятие эквивалентности. Два элемента эквивалентны, если ни один не меньше другого:

if (!(a < b || b < a))
    // equivalent!

находится ли элемент в своем дереве, и ему нужен только оператор <. (Стандартно применяется только использование less, остальное - просто средняя реализация)

Решение Вопроса

имею переопределить любой оператор,std::set class template позволяет вам предоставить функцию сравнения в качестве параметра шаблона. Но если бы вы предоставили оператора, то нужно было быbool operator<(). Этот оператор должен реализовать строгий слабый порядок. Посмотри этоstd :: набор документация

Причина, по которой используется строгий слабый порядок, заключается в том, что set - это упорядоченный контейнер, обычно реализуемый как самобалансирующееся двоичное дерево. Поэтому недостаточно знать, являются ли два элемента одинаковыми или нет. Набор должен быть в состоянии заказать их. И оператор меньше, или функтор компаратора также используются для проверки на равенство элементов.

 Walter03 июн. 2012 г., 20:02
Меня смущает, что "вам не нужно переопределять операторы".Есл std::set<Value> должен быть использован, тогдаstd::less<Value> будет использоваться по умолчанию. Разве это не требуетoperator<?
 juanchopanza03 июн. 2012 г., 20:36
@ Walter, вы можете передать свой собственный компаратор в качестве второго параметра шаблона, который затем заменит значение по умолчанию,std::less<Value>. Это очень удобно, потому что вы хотите создавать наборы, содержащие объекты типов безoperator < и который ты не можешь контролировать.
 Cory Trese31 окт. 2013 г., 22:27
Я хотел бы +1, но ответ кажется неполным, он не содержит ответа на вопрос, только намек на то, что ответ где-то существует! Примеры синтаксиса действительно помогают, особенно с чем-то, что описывается просто как второй параметр.
 juanchopanza31 окт. 2013 г., 23:22
@ CoryTrese OP спрашивает, какие операторы должны быть перегружены, и я отвечаю на этот вопрос. Ссылок должно быть достаточно для того, чтобы кто-нибудь выяснил все остальное.
 Walter03 июн. 2012 г., 20:57
+ 1 хорошо, я неправильно понял твой ответ. Конечно,есл вы предоставляете второй аргумент шаблона, тогда вам не нужно предоставлятьoperator<. И да, это может быть очень удобно, в частности, если вы не хотите предоставлять этот оператор, так как это может запутать другой код или (как вы сказали), если @ уже есoperator< в значении, отличном от вашего предполагаемого заказа.

Ваш ответ на вопрос