Форум программистов, компьютерный форум CyberForum.ru

Обход элементов std::map в порядке их создания - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ WDK и Visual Studio 2008 http://www.cyberforum.ru/cpp/thread260057.html
Всем доброго времени суток. Скачал Windows DDK с майкрософта. Установил в C:\WinDDK\7600.16385.1 Включил в свойствах, (свойства конфигурации -> c\c++) Дополнительные каталоги включения: "C:\WinDDK\7600.16385.1\inc\crt\";"C:\WinDDK\7600.16385.1\inc\api\";"C:\WinDDK\7600.16385.1\inc\ddk\" #include <usbioctl.h> // только в WDK находится этот файл. ... bresult = DeviceIoControl(hDevice,...
C++ Прописать условия в IF Есть такая тема. Нужно вычислить делится ли определённое четырёхзначное число на ряд чисел. Причём нацело, т.е. без остатка. Если делится то в переменную Х записать одно число, если не делится - другое. Я планирую это реализовать в условии if. Как правильно сформулировать это кодом? http://www.cyberforum.ru/cpp/thread259987.html
C++ Вычислить и запомнить суммы и числа элементов каждой строки матрицы
вычислить и запомнить суммы и числа элементов каждой строки матрицы. результаты отпечатать в виде двух столбцов A(N,M) N<=20 M<=15
C++ Зацикливается при неверном вводе
есть такой кусочек while(true) { scanf("%d%c%d", &x, &zn, &y); switch (zn) { case '+': rez=x+y; break;
C++ Произвести проверку соблюдения баланса скобок http://www.cyberforum.ru/cpp/thread259819.html
Произвести проверку соблюдения баланса скобок вида ‘(‘, ’)’ в арифметическом выражении. Использовать системный стек. нужно на С
C++ Функции Составить процедуру, результатом работы которой является символ, заданный при обращении к этой процедуре, если этот символ не является буквой, и соответствующая строчная (малая) буква в противном. Добавлено через 16 минут код на С подробнее

Показать сообщение отдельно
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
17185 / 5439 / 337
Регистрация: 30.03.2009
Сообщений: 14,748
Записей в блоге: 26

Обход элементов std::map в порядке их создания - C++

19.03.2011, 13:18. Просмотров 5905. Ответов 7
Метки (Все метки)

Имеется ассоциативный массив и его заполнение:

C++
1
2
3
4
std::map<unsigned,string> arr;
arr[10] = "abc";
arr[7] = "def";
arr[20] = "ghi";
Теперь если я буду обходить этот массив при помощи итераторов, то обход будет производиться в порядке возрастания ключа массива: т.е. в данном случае обойдутся элементы в порядке 7, 10, 20

Мне хочется обойти массив в порядке создания его элементов, т.е. 10, 7, 20. Вот здесь я прочёл, что в шаблон можно подать некий третий параметр Compare

Compare: Comparison class: A class that takes two arguments of the key type and returns a bool. The expression comp(a,b), where comp is an object of this comparison class and a and b are key values, shall return true if a is to be placed at an earlier position than b in a strict weak ordering operation. This can either be a class implementing a function call operator or a pointer to a function (see constructor for an example). This defaults to less<Key>, which returns the same as applying the less-than operator (a<b).
1. Я правильно понимаю, что этот параметр шаблона влияет ТОЛЬКО на процесс занесения элементов в таблицу (ну и, как побочный эффект, влияет на порядок обхода через итераторы) и ничего больше другого не делает
2. Как описать этот Compare для моего случая? У меня слишком маленький опыт работы с Си++, и, читая документацию, совсем сломал мозги. По исходнику контейнера map я тоже понять ничего не могу - для меня это ещё слишком сложно

Добавлено через 20 минут
Наконец, понял, что за ошибку выдавал компилятор, когда я пытался сделать так, как показано в примерах у людей: я Compare подавал третьим параметром в шаблон при описании массива, но итератор был написан как раньше - с двумя параметрами.

Итого, получается что-то типа того:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class compare
{
  public:
    bool operator() (const unsigned x,const unsigned y) const { return true; }
};
 
std::map<unsigned,string> arr;
arr[10] = "abc";
arr[7] = "def";
arr[20] = "ghi";
 
std::map<unsigned,string,compare>::const_iterator iter;
for (iter = arr.begin(); iter != arr.end(); iter++)
  ...
Но всё-таки хотелось бы услышать ответ на вопрос номер 1.

Добавлено через 1 час 14 минут
Однако при таком раскладе неправильно работает чтение элементов массива (x = arr[7]) или проверка наличия элемента (arr.find(7) != arr.end()). Так что вопрос снова актуален
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 17:30. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru