#c #oop #find #string-comparison #stdmap
#c
Вопрос:
class compare
{
public:
bool operator()(const int x,const int y) const
{
if(x-y == 0)
return false;
else
return true;
}
};
int main()
{
std::map<char,int,compare> mymap;
//Add data into map
mymap.insert ( std::pair<char,int>('f',100) );
mymap.insert ( std::pair<char,int>('a',100) );
mymap.insert ( std::pair<char,int>('k',100) );
mymap.insert ( std::pair<char,int>('z',200) );
//try to find a key in map
std::map<char,int,compare>::iterator l_pos = mymap.begin();
l_pos = mymap.find('z');
if(l_pos != mymap.end())
{
printf("nfound = %cn",l_pos->first);
}
else
{
printf("Not found = %cn",l_pos->first);
}
}
Результат:
Not found =
Но если я покажу карту, я смогу увидеть содержимое. моя карта содержит: f => 100 a => 100 k => 100 z => 20
Поиск в stl-карте не работает, когда написана пользовательская функция сравнения, которая останавливает сортировку ключей. Поиск завершается ошибкой. Есть ли способ это исправить? Поиск не возвращает никаких данных. Я знаю, что карты stl не предназначены для этой цели. Но есть ли способ это исправить? Функция сравнения останавливает сортировку. Записи сохраняются в обратном порядке. Когда я использую цикл for для итерации по карте, я вижу все значения. Не работает только команда find .
Комментарии:
1. Ваше сравнение должно реализовывать строгий слабый порядок , иначе результаты не определены.
2. Имейте в виду, что
std::map
это отличается от STLmap
. STL — это библиотека, на которой была основана большая часть стандартной библиотеки, но стандартные библиотечныеtemplate
контейнеры и алгоритмы не являются STL.
Ответ №1:
Ваш compare
функтор сломан.
A map
использует компаратор для реализации строгого слабого упорядочения.
23.1.2 Ассоциативные контейнеры
Каждый ассоциативный контейнер параметризуется по ключу, а отношение упорядочения Сравнивает, что вызывает строгий слабый порядок (25.3) для элементов ключа.
Ваша compare()
функция этого не делает, что приводит к неопределенному поведению. Здесь не map
это сломано, а ваше использование, поэтому нет способа «исправить» это, кроме переопределения compare()
, чтобы вызвать строгий слабый порядок элементов или использовать контейнер, отличный от map
.
Ответ №2:
std::map
требуется, чтобы ваш оператор сравнения реализовал строгий слабый порядок, и поведение не определено, если компаратор не реализует эти требования. Вы не можете заставить свою карту работать с имеющимся у вас сравнением.
Возможно, если вы более подробно расскажете о реальной проблеме, которую вы пытаетесь решить, мы сможем вам помочь.
Комментарии:
1. В настоящее время я использую цикл for для поиска элемента.
2. @user2432572 это не имеет значения. Ваша карта повреждена.