Минимальное значение для контроля std :: map order [duplicate]

неопределенная ссылка на WinMain@16 или аналогичную «необычную» main() ссылку на точку входа (особенно для ).

Вы возможно, пропустили, чтобы выбрать правильный тип проекта с вашей реальной IDE. IDE может захотеть связать, например. Проекты приложений Windows для такой функции точки входа (как указано в недостающей ссылке выше) вместо обычной int main(int argc, char** argv);.

Если ваша среда IDE поддерживает Plain Console Projects , вы может захотеть выбрать этот тип проекта вместо проекта приложения Windows.


Здесь case1 и case2 обрабатываются более подробно из реальный мир проблема.

63
задан Kian 27 August 2013 в 12:30
поделиться

4 ответа

Все, что требуется от ключа, состоит в том, что оно может копироваться и присваиваться. Порядок в карте определяется третьим аргументом шаблона (и аргументом для конструктора, если он используется). Этот параметр по умолчанию равен std::less<KeyType>, по умолчанию используется оператор <, но нет необходимости использовать значения по умолчанию. Просто напишите оператор сравнения (желательно как функциональный объект):

struct CmpMyType
{
    bool operator()( MyType const& lhs, MyType const& rhs ) const
    {
        //  ...
    }
};

Обратите внимание, что он должен определять строгий порядок, т. Е. Если CmpMyType()( a, b ) возвращает true, тогда CmpMyType()( b, a ) должен возвращать значение false, а если оба возвращают false, элементы считаются равными (члены одного и того же класса эквивалентности).

57
ответ дан James Kanze 5 September 2018 в 07:46
поделиться

То же, что и для set: класс должен иметь строгий порядок в духе «меньше». Либо перегрузите соответствующий operator<, либо создайте собственный предикат. Любые два объекта a и b, для которых !(a<b) && !(b>a) будут считаться равными.

Контейнер карты фактически сохранит все элементы в порядке, предусмотренном этим заказом, что и можно достичь O (log n) и время вставки по значению ключа.

2
ответ дан Kerrek SB 5 September 2018 в 07:46
поделиться

Ответ на самом деле находится в ссылке, которую вы ссылаетесь, в описании аргумента шаблона «Сравнить».

Единственное требование - Compare (по умолчанию это less<Key>, по умолчанию использование operator< для сравнения ключей) должно быть «строгим слабым порядком».

3
ответ дан Nemo 5 September 2018 в 07:46
поделиться

Вам нужно определить оператор & lt ;, например, например:

struct A
{
  int a;
  std::string b;
};

// Simple but wrong as it does not provide the strict weak ordering.    
// As A(5,"a") and A(5,"b") would be considered equal using this function.
bool operator<(const A& l, const A& r )
{
  return ( l.a < r.a ) && ( l.b < r.b );
}

// Better brute force.
bool operator<(const A& l, const A& r )
{ 
    if ( l.a < r.a )  return true;
    if ( l.a > r.a )  return false;

    // Otherwise a are equal
    if ( l.b < r.b )  return true;
    if ( l.b > r.b )  return false;

    // Otherwise both are equal
    return false;
}

// This can often be seen written as
bool operator<(const A& l, const A& r )
{
   // This is fine for a small number of members.
   // But I prefer the brute force approach when you start to get lots of members.
   return ( l.a < r.a ) ||
          (( l.a == r.a) && ( l.b < r.b ));
}
20
ответ дан Vaidotas Strazdas 5 September 2018 в 07:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: