Как я могу создать собственный объект сравнения строк для карты C ++ - PullRequest
0 голосов
/ 04 июня 2018

Мне нужна карта ключей, чтобы рассматривать '-' как '1' или '0'.

Например:

В map<string, int> уже есть элемент <"1-1", 1>.Когда я использую map.find("101"), я должен получить <"1-1", 1>.

Это моя функция

struct keycompare
{
    bool operator()(const std::string& x, const std::string& y)
    {
        int len = x.length();
        for(int i=0;i<len;i++){
            if(x[i]==y[i])continue;
            else if( x[i]=='-'  || y[i]=='-')continue;
            else return x[i]<y[i];
        }
        return false;
    }
};

В некоторых случаях, когда я использую map.find(), она пойдет не так.Есть ли хороший способ отладки?

1 Ответ

0 голосов
/ 04 июня 2018

Нельзя использовать такое сравнение с std::map.

Одним из требований к элементу шаблона Compare является транзитивность отношения эквивалентности !comp(a, b) && !comp(b, a).Ваше сравнение не выполняется, например, в случае

keycompare comp;

auto equiv = [comp](auto l, auto r) { return !comp(l, r) && !comp(r, l); };

std::string a("111");
std::string b("1-1");
std::string c("101");

std::cout << std::boolalpha << "a == b " << equiv(a, b) << std::endl;
std::cout << std::boolalpha << "b == c " << equiv(b, c) << std::endl;
std::cout << std::boolalpha << "a == c " << equiv(a, c) << std::endl;

В частности, если ваша карта содержит и «111», и «101», что должно быть найдено при поиске «1-1»?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...