LINUX.ORG.RU

(C++) Вопрос о map


0

0

Что лучше использовать для однозначного отображения строка -> строка:

map<char*, char* >
или
map<std::string, std::string>

В чем плюсы и минусы каждого подхода? Будет ли c char* работать быстрее при использовании длинных ключей?

anonymous

map<char*, char*> на сколько я понимаю, будет работать совершенно непредсказуемым образом, т.к. массиве будут храниться указатели. к примеру assoc_array["some_existing_string"] не будет работать, даже если есть указатель на "some_existing_string"

хотя может я и не прав.с++ - не моё

anonymous
()

char* просто не будет работать :-) по крайней мере не так как
вы ожидаете. char* это не строка, это _указатель_, просто
некотрый адрес, число. И мап при вставке/удалении будет работать
с указателями. А вообще эта тема обсуждалась здесь
несколько месяцев назад, попробуйте поискать. Кроме того вот,
почитайте:
http://coding.derkeiler.com/Archive/C_CPP/comp.lang.cpp/2003-10/1018.html
Я не смотрел, но думаю в std строках реализован какой-нибудь
метод отложенного копирования. Поэтому разницу между
мапом с указателями и с настоящими строками вы заметите
если только будете копировать их десятками тысяч. А может и
не заметите.

anonymous
()

Я как раз наталкивался на случай, когда char* приводил к непредсказуемым результатам. Все строки после определённых действий, не относящихся никаким образом к переменной типа map<int, char*>, просто обрезались. Используй string.

Selecter ★★★★
()
Ответ на: комментарий от Selecter

Если работать с умом, то можно и char * использовать в качестве параметра шаблона без всяких непредсказуемых поведений. Просто у тебя где-то этот char * удалялся отсюда все проблемы и лезли.

Только не надо забывать, что когда указатель в качестве ключа используешь, то будет происходить сравнение указателей, а не строк, поэтому если надо строки сравнивать, то надо добавить 3й параметр к map'у.

Reset ★★★★★
()
Ответ на: комментарий от anonymous

>Я не смотрел, но думаю в std строках реализован какой-нибудь метод отложенного копирования

По-моему, от этого давно уже отказались, потому как вылезают глюки при многопоточности.

Лично я бы выбрал std::map<char*, char*, CStringComparator>, где CStringComparator - компаратор для сишных строк, написанный автором топика:).

V_L_A_D ★★
()
Ответ на: комментарий от V_L_A_D

> По-моему, от этого давно уже отказались, потому как вылезают глюки при многопоточности.

Не отказались. А потокобезопасность STL нигде не обещана. Отложенное копирование легко обходится там, где надо.

watashiwa_daredeska ★★★★
()
Ответ на: комментарий от V_L_A_D

а чем Вас не устраивает

typedef const char* const ConstNullStr;

std::map<ConstNullStr,ConstNullStr,[компаратор]> ?

>Я не смотрел, но думаю в std строках реализован какой-нибудь метод отложенного копирования

Не стоит делать предположений о реализации Stl. Все они заведомо неверные

binf
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.