Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: CMap - этот странный-странный мир...  (Прочитано 9445 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« : 15-05-2006 14:24 » 

Народ,

может кто-то сможет мне объяснить следующее:
Создаю CMap для строк, т.е. ключ и значение д.б. строками. Пока еще все хорошо.  Отлично
Вношу туда три пары значений:
Код:
	CMap <CString, LPCSTR, CString, LPCSTR> cmapTestStr;

CString cstrVal1 = "1", cstrKeyStr = "Nr.";
cmapTestStr.SetAt(cstrKeyStr, cstrVal1);
cstrVal1 = "offset";
cstrKeyStr = "Parameter";
cmapTestStr.SetAt(cstrKeyStr, cstrVal1);
cstrVal1 = "9";
cstrKeyStr = "Wert";
cmapTestStr.SetAt(cstrKeyStr, cstrVal1);

И это пока еще хорошо  Отлично
Но вот дальше я проверяю содержимое:
Код:

POSITION pos = cmapTestStr.GetStartPosition();
while (pos)
{
// holen jedes Element
cmapTestStr.GetNextAssoc(pos, cstrKeyStr, strTmpMap);
}

и вот тут наступает момент истины - сначала появляется элемент с ключом = "Parameter", затем - "Wert", затем - "Nr.".
Где логика??? ("Где деньги, Зин?" (С)   Не понял) Даже если предположить, что он что-то там сортирует, то в алфавите сначала идет буква "N", затем "P" и завершает этот ряд "W".
Короче, моя крыша этого не понимает  А черт его знает...
Заранее благодарна.
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
Alf
Гость
« Ответ #1 : 15-05-2006 20:49 » 

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

Если нужно непременно выбирать элементы в алфавитном порядке, полагаю, нужно проделать следующее:

- выбрать все ключи в массив;
- отсортировать массив ключей в алфавитном порядке;
- для каждого значения ключа найти ассоциированное с ним значение.

P.S. В довершение - кусочек MSDN'а:

Цитата
A variable of type POSITION is used for alternate access to entries. You can use a POSITION to “remember” an entry and to iterate through the map. You might think that this iteration is sequential by key value; it is not. The sequence of retrieved elements is indeterminate.

(выделение мое)
« Последнее редактирование: 19-12-2007 19:56 от Алексей1153++ » Записан
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #2 : 16-05-2006 06:59 » 

Alf,

ага, спасибочки - этого я не дочитала Ага
В результате я сделала следующее (т.к. для меня важен порядок внесения элементов в Mapе): каждый ключ я записала как индекс:ключ (т.е. например: "1:Nr."). Т.о. вне зависимости от расположения я теперь знаю, кто и за кем Ага

А вообще все это не совсем радует, если твое расположение элементов меняют без твоего ведома... Обидно... А черт его знает...
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
Alf
Гость
« Ответ #3 : 16-05-2006 07:25 » 

...каждый ключ я записала как индекс:ключ (т.е. например: "1:Nr."). Т.о. вне зависимости от расположения я теперь знаю, кто и за кем Ага

А нет перспективы, что в дальнейшем добавятся еще ключи? Если придется что-то добавлять в середину, нумерация поедет, и будет не так уж просто восстановить статус-кво.

Мне кажется, тут CMap используется не по назначению. Он задуман как ассоциативный массив, в котором обеспечивается быстрый доступ к значению, связанному с данным ключом. Хранение сортированных последовательностей - не его конек.

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

А вообще все это не совсем радует, если твое расположение элементов меняют без твоего ведома... Обидно... А черт его знает...

Так они и не обещали никакой упорядоченности при хранении. Дописывать элементы в хвост в порядке поступления - значит сделать поиск очень медленным. Сортировать ключи в лексикографическом порядке - значит замедлить вставку. С основной задачей - ассоциированием значения с ключом - CMap справляется блестяще, а большего с хэш-таблицы и не возьмешь.

Тут, кстати, еще такая проблема выплывает. В европейских языках (французском, немецком и т.д.) алфавиты каждый со своими вывихами, к латинским буквам добавляются всякие умляуты, диакритические знаки и прочая дребедень. Получается, что алфавитная сортировка не обеспечивается побайтным упорядочением литер, нужно делать сортировку с национальным акцентом. Поэтому сделать межкультурный контейнер с алфавитной сортировкой IMHO будет не столь просто.
Записан
Alf
Гость
« Ответ #4 : 16-05-2006 07:26 » 

Кстати, а насколько велика таблица (единицы, тысячи, миллионы записей)?
Записан
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #5 : 16-05-2006 09:21 » new

asker,

Таблица крохотная - не более 10 элементов (пока Ага )
Насчет изменений - вопрос щекотливый... Это и так особый случай, который мне пришлось обрабатывать отдельно (хотя я этого всеми силами и фибрами души старалась избежать), все остальное я загнала в общую схему и оно там прекрасно работает.
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines