Поиск в stl-карте не работает, когда написана пользовательская функция сравнения, которая останавливает сортировку ключей

#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 это отличается от STL map . STL — это библиотека, на которой была основана большая часть стандартной библиотеки, но стандартные библиотечные template контейнеры и алгоритмы не являются STL.

Ответ №1:

Ваш compare функтор сломан.

A map использует компаратор для реализации строгого слабого упорядочения.

23.1.2 Ассоциативные контейнеры

Каждый ассоциативный контейнер параметризуется по ключу, а отношение упорядочения Сравнивает, что вызывает строгий слабый порядок (25.3) для элементов ключа.

Ваша compare() функция этого не делает, что приводит к неопределенному поведению. Здесь не map это сломано, а ваше использование, поэтому нет способа «исправить» это, кроме переопределения compare() , чтобы вызвать строгий слабый порядок элементов или использовать контейнер, отличный от map .

Ответ №2:

std::map требуется, чтобы ваш оператор сравнения реализовал строгий слабый порядок, и поведение не определено, если компаратор не реализует эти требования. Вы не можете заставить свою карту работать с имеющимся у вас сравнением.

Возможно, если вы более подробно расскажете о реальной проблеме, которую вы пытаетесь решить, мы сможем вам помочь.

Комментарии:

1. В настоящее время я использую цикл for для поиска элемента.

2. @user2432572 это не имеет значения. Ваша карта повреждена.