Проблема с картой C ++ - PullRequest
       4

Проблема с картой C ++

2 голосов
/ 13 марта 2011

У меня есть

 map<char*, int> labels;

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

ранее в моей программе, я добавляю запись следующим образом:

labels[current->u.bj.target->name] = blockNum + 1;
//Test code

    if (blockNum + 1 == 9)
    {
        stringtest = current->u.bj.target->name;
        cout << "Condition Met" << endl;
        testCond = true;
    }

позже в моей программе, я делаю следующее

if ((*stringtest) == (*current->u.bj.target->name))
    cout << "Why is this printing the correct val " <<labels[stringtest] << endl;
branchTarget = labels[current->u.bj.target->name];
cout << "Why is this value different" << branchTarget << endl;

как вы можете сказать из операторов cout, labels[stringtest] возвращает 9, но labels[current->u.bj.target->name] возвращает 0, несмотря на то, что они оба указывают на одно и то же.Может кто-нибудь дать мне представление, что не так / как это исправить?Я почти уверен, что никогда не ставлю 0 на карту вообще.

Ответы [ 4 ]

8 голосов
/ 13 марта 2011

Проблема, вероятно, исчезнет, ​​если вы замените map<char*, int> на map<string, int>.Это связано с тем, что при сравнении двух char* объектов сравниваются только указатели, а не символы, тогда как при сравнении двух string объектов сравниваются символы.

(не забудьте #include <string>).

1 голос
/ 13 марта 2011

Это утверждение

((*stringtest) == (*current->u.bj.target->name)) 

сравнивает первый символ символов, содержащихся в соответствующих массивах. Так что с картой все в порядке, вы просто сравниваете «яблоки с апельсинами». Я рекомендую заменить std::map< char*, int > на std::map< std::string, int >.

1 голос
/ 13 марта 2011

Кажется, что current->u.bj.target->name - это char*. Поэтому, когда вы пишете

if ((*stringtest) == (*current->u.bj.target->name))

вы разыменовываете две char* и сравниваете char, на которые они указывают. Таким образом, вы сравниваете только первые символы обеих строк!

Кроме того, использование указателей в качестве ключей для map опасно, если вы не будете осторожны. Поиск будет работать правильно, только если вы передадите указатель на ту же строку , а не на другую строку, в которой содержит те же символы . Используйте std::string, как уже предлагал FredOverflow, если вы хотите последнее поведение.

0 голосов
/ 13 марта 2011

Любой тип указателя будет сравниваться (по умолчанию) по адресу памяти, поэтому единственный способ, которым он вернет совпадение, - это если указатели находятся на одном и том же объекте. Как уже говорили другие люди, хорошим способом для этого является использование контейнера с оператором сравнения (например, std :: string), или вы можете перегрузить функцию сравнения, которая является третьим параметром шаблона, в std :: map для класса Вы написали, что разыменовывает указатели и сравнивает значения вместо

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