Форум программистов, компьютерный форум, киберфорум
Наши страницы

Обход элементов 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++ Зацикливается при неверном вводе есть такой кусочек while(true) { scanf("%d%c%d", &x, &zn, &y); switch (zn) { case '+': rez=x+y; break; http://www.cyberforum.ru/cpp/thread259828.html
Функции C++
Составить процедуру, результатом работы которой является символ, заданный при обращении к этой процедуре, если этот символ не является буквой, и соответствующая строчная (малая) буква в противном. ...
Работа с командной строкой C++
Ситуация: у меня есть программа-интерпретатор другого языка. Работает через командную строку. Преподаватель попросил следующее: реализовать простейшие арифметические операции, которые при этом...
C++ Ошибка в программе http://www.cyberforum.ru/cpp/thread259562.html
пишу задачу на классы в Си++,но не могу разобраться что за ошибка,помогите это очень важно #include<iostream.h> #include<conio.h> #include<math.h> #include<stdio.h> class Student { private:
C++ Симуляция нажатия кнопки ПОДСКАЖИТЕ как сделать симуляцию нажатия кнопки в заданое время. т.е. мне нужно что бы клавиша ENTER нажалась в определенное время без моего присутствия подробнее

Показать сообщение отдельно
Evg
Эксперт CАвтор FAQ
18260 / 6385 / 440
Регистрация: 30.03.2009
Сообщений: 17,670
Записей в блоге: 28

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

19.03.2011, 13:18. Просмотров 6530. Ответов 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()). Так что вопрос снова актуален
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru