неопределенная ссылка на WinMain@16
или аналогичную «необычную» main()
ссылку на точку входа (особенно для visual-studio ).
Вы возможно, пропустили, чтобы выбрать правильный тип проекта с вашей реальной IDE. IDE может захотеть связать, например. Проекты приложений Windows для такой функции точки входа (как указано в недостающей ссылке выше) вместо обычной int main(int argc, char** argv);
.
Если ваша среда IDE поддерживает Plain Console Projects , вы может захотеть выбрать этот тип проекта вместо проекта приложения Windows.
Здесь case1 и case2 обрабатываются более подробно из реальный мир проблема.
Все, что требуется от ключа, состоит в том, что оно может копироваться и присваиваться. Порядок в карте определяется третьим аргументом шаблона (и аргументом для конструктора, если он используется). Этот параметр по умолчанию равен std::less<KeyType>
, по умолчанию используется оператор <
, но нет необходимости использовать значения по умолчанию. Просто напишите оператор сравнения (желательно как функциональный объект):
struct CmpMyType
{
bool operator()( MyType const& lhs, MyType const& rhs ) const
{
// ...
}
};
Обратите внимание, что он должен определять строгий порядок, т. Е. Если CmpMyType()( a, b
)
возвращает true, тогда CmpMyType()( b, a )
должен возвращать значение false, а если оба возвращают false, элементы считаются равными (члены одного и того же класса эквивалентности).
То же, что и для set
: класс должен иметь строгий порядок в духе «меньше». Либо перегрузите соответствующий operator<
, либо создайте собственный предикат. Любые два объекта a
и b
, для которых !(a<b) && !(b>a)
будут считаться равными.
Контейнер карты фактически сохранит все элементы в порядке, предусмотренном этим заказом, что и можно достичь O (log n) и время вставки по значению ключа.
Ответ на самом деле находится в ссылке, которую вы ссылаетесь, в описании аргумента шаблона «Сравнить».
Единственное требование - Compare
(по умолчанию это less<Key>
, по умолчанию использование operator<
для сравнения ключей) должно быть «строгим слабым порядком».
Вам нужно определить оператор & 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 ));
}