Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.04.2010, 22:32   #1
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию сортировка std::map

Мне нужно отсортировать map по убыванию значений. Мой класс Map
сортируется этой функцией без проблем, а вот стандартный std::map отсортировать ею не получается.

Не пойму в чем проблема

Ошибочные строки я выделил.
Ругается на оператор = :

Цитата:
WR.cpp: In function `void _swap(T&, T&) [with T = const std::string]':
WR.cpp:66: instantiated from here
WR.cpp:53: error: passing `const std::string' as `this' argument of `std::basic_string<_CharT, _Traits, _Alloc>& std::basic_string<_CharT, _Traits, _Alloc>:: operator=(const std::basic_string<_CharT, _Traits, _Alloc>&) [with _CharT = char, _Traits = std::char_traits<char>, _Alloc = std::allocator<char>]' discards qualifiers
WR.cpp:66: instantiated from here
WR.cpp:54: error: passing `const std::string' as `this' argument of `std::basic_string<_CharT, _Traits, _Alloc>& std::basic_string<_CharT, _Traits, _Alloc>:: operator=(const std::basic_string<_CharT, _Traits, _Alloc>&) [with _CharT = char, _Traits = std::char_traits<char>, _Alloc = std::allocator<char>]' discards qualifiers
Код:

//#define MY_MAP // переключение между моим Map и std::map

#ifndef MY_MAP
     #define Map map 
#endif

template<typename T>
void _swap(T &a, T &b) {
   T tmp = a;   
   a = b;    // ОШИБКА строка 53 
   b = tmp; // ОШИБКА строка 54
}

void sort_map(Map<string, int> &m){  
  Map<string, int>::iterator _it, it, it2;
  int i, j, size = m.size();
  _it = m.begin();
  it = _it;		
	for(i=0; i < size; i++, it++){	    
	    for(j=i, it2=it; j < size; j++, it2++){
		    if( m[ it->first ] < m[ it2->first ] ) {
			   _swap( m[it->first], m[it2->first] );	// обмен значений	   
			   _swap( (it->first), (it2->first)); // обмен ключей ( ОШИБКА ) строка 66 
                    }
		}		
	}
}

Последний раз редактировалось NiCola999; 27.04.2010 в 23:02.
NiCola999 вне форума Ответить с цитированием
Старый 27.04.2010, 23:01   #2
ozo
Форумчанин
 
Аватар для ozo
 
Регистрация: 26.04.2010
Сообщений: 328
По умолчанию

1. чем std::swap плох ?
2. std::map сам сортируется таки, третий аргумент(необязательный) шаблона задает критерий сортировки.
3. вручную в std::map ключи двигать, на сколько я помню, нельзя. Нужно вынимать элемент и вставлять заново, ибо бинарные деревья.
Используй гугль, будь счастлив
hackme@yandex.ru
Блог об archlinux
ozo вне форума Ответить с цитированием
Старый 27.04.2010, 23:14   #3
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию

спасибо, клево я листья красно-черного дерева двигал =)

Последний раз редактировалось NiCola999; 27.04.2010 в 23:43.
NiCola999 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
E2015 Ambiguity between 'std::log(double)' and 'std::log(long double)' Namolem Помощь студентам 3 02.04.2011 20:22
Map Chartvit Общие вопросы C/C++ 1 01.12.2009 19:22
map Vladimir_D Общие вопросы C/C++ 1 17.10.2009 13:37
std Викдон Общие вопросы C/C++ 3 17.02.2009 11:33
namespace std; lacost Общие вопросы C/C++ 8 22.10.2007 13:17