Вызов карты :: поиск с аргументом const - PullRequest
5 голосов
/ 29 сентября 2010

У меня есть объект:

map<A*, string> collection;

Я хотел бы вызвать функцию map :: find, но у меня есть значение для ключа const, как в следующем коде, который не компилируется:

const A* a = whatever();
collection.find(a);

Следующий код работает и выполняет эквивалент операции поиска:

const A* a = whatever();
map<A*, string>::iterator iter;
for(iter = collection.begin(); iter != collection.end(); ++iter)
    if(iter->first == a)
        break;
// iter now contains the result or map::end (just like map::find)

Но, вероятно, он не так эффективен, как функция поиска члена, и также уродлив имаскирует намерение кода.

Как мне вызвать функцию поиска?

Спасибо

Редактировать:

Янамеренно используя тип указателя для ключа на карте.Я хочу, чтобы карта использовала равенство указателей для ключей.(Так же, как в моем коде цикла)

Ответы [ 2 ]

11 голосов
/ 29 сентября 2010

Сравнение указателей не имеет к этому никакого отношения. OP может или не может нуждаться в пользовательской операции сравнения; мне кажется, что они просто ищут конкретный объект по его адресу, что кажется вполне разумным. Первые два ответа, по-видимому, упустили момент, когда find () не компилируется, пока работает рукописный поиск.

Вызов find() не скомпилируется, потому что вы передаете неверный тип для поиска. map::find() ожидает, что его аргумент будет того же типа, что и тип ключа карты, который равен A*. Вы передаете const A*, который неявно конвертируется в A* (но сравним с A*, поэтому поиск по рукописи работает). Неявное преобразование работает только в другом направлении (A* в const A*, а не const A* в A*).

Возможно, вы должны использовать const A* вместо A* в качестве ключа карты; в зависимости от того, для чего вы используете карту, это может быть или не быть практичным. Если вам нужен ключ карты A*, вам нужно передать A* в find(), что означает либо начинание с A* в качестве цели поиска в первую очередь, либо, если вы можете только получить его из его исходного источника как const A*, используя find(const_cast<A*>(a)), чтобы превратить его в указатель на неконстантный (который не совпадает с неконстантным указателем, точкой, которая сбивает с толку многих C / C ++ кодеров). Обычно const_cast нецелесообразно, но здесь это безопасно, поскольку вы только сравниваете указатель, а не разыменовываете его.

1 голос
/ 29 сентября 2010

Вы всегда можете удалить констант

const A* a = whatever();
collection.find( const_cast<A*>(a) );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...