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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.05.2010, 23:34   #1
m9yt
Форумчанин
 
Регистрация: 17.11.2009
Сообщений: 108
По умолчанию Сортировка multiset

Привет всем.
Мне необходимо отсортировать контейнер multimap по убыванию, в контейнере находятся объекты моего класса, в котором 2 поля.Сортировать нужно по 1-вому полю типа string.
При создании контейнера элементы благополучно сортируются по возрастанию( в классе перегружен оператор <).
Но вот что написано в методичке:
"некоторые алгоритмы могут не поддерживать используемые в вашей программе контейнеры. Например, алгоритм sort не поддерживает контейнеры, которые не имеют итераторов произвольного доступа. В этом случае следует написать свой алгоритм. Например, для стека алгоритм сортировки может выполняться следующим образом: переписать стек в вектор, отсортировать вектор, переписать вектор в стек.
При перемещении элементов ассоциативного контейнера в неассоциативный перемещаются только данные (ключи не перемещаются). И, наоборот, при перемещении элементов неассоциативного контейнера в ассоциативный должен быть сформирован ключ.
Вопрос в том, как сформировать этот ключ?

Вот мои наработки:
Сама функция сортировки.
Вектор сортируется как надо, но при вставке в мультисет все записывается наоборот!
Код:
class cmp{
public:
	bool operator()(country ob1, country ob2){
		return (ob1.get_name()>ob2.get_name());
	}
};
Код:
void my_sort(multiset<country> & SET)
{
	vector<country> v;
	multiset<country>::iterator p;
	vector<country>::iterator d;
	p=SET.begin();
	for(p; p!=SET.end(); p++)
		v.push_back(*p);
	d=v.begin();
	sort(d, d=v.end(), cmp());
	d=v.begin();
	SET.clear();
	for(d; d!=v.end(); d++)
		SET.insert(*d);
}
m9yt вне форума Ответить с цитированием
Старый 11.05.2010, 00:03   #2
ISergeyN
Maniac
Форумчанин
 
Аватар для ISergeyN
 
Регистрация: 03.01.2009
Сообщений: 450
По умолчанию

Как такой вариант прокатит? ..
Код:
#include <functional>
#include <iostream>
#include <set>


int main(){

	int arr[10] = {1, 2, 3, 4, 5, 5, 4, 3, 2, 1};

	std::multiset<int, std::less<int> >    mless(arr, arr + 10);
	std::multiset<int, std::greater<int> > mgreater(arr, arr + 10);

	std::multiset<int, std::less<int> >::iterator il = mless.begin(); 
	std::multiset<int, std::greater<int> >::iterator ig = mgreater.begin(); 

	for(; il != mless.end(); ++il)
		std::cout << *il << " ";

	std::cout << std::endl;

	for(; ig != mgreater.end(); ++ig)
		std::cout << *ig << " ";

	return 0;
}
http://codepad.org/HiCRnqYb
Стандартные библиотеки разработаны с учетом многолетнего опыта лучших программистов и они не больны "детскими болезнями крутизны в программизме"....
ISergeyN вне форума Ответить с цитированием
Старый 11.05.2010, 00:10   #3
m9yt
Форумчанин
 
Регистрация: 17.11.2009
Сообщений: 108
По умолчанию

Цитата:
Сообщение от ISergeyN Посмотреть сообщение
Как такой вариант прокатит? ..
Код:
#include <functional>
#include <iostream>
#include <set>


int main(){

	int arr[10] = {1, 2, 3, 4, 5, 5, 4, 3, 2, 1};

	std::multiset<int, std::less<int> >    mless(arr, arr + 10);
	std::multiset<int, std::greater<int> > mgreater(arr, arr + 10);

	std::multiset<int, std::less<int> >::iterator il = mless.begin(); 
	std::multiset<int, std::greater<int> >::iterator ig = mgreater.begin(); 

	for(; il != mless.end(); ++il)
		std::cout << *il << " ";

	std::cout << std::endl;

	for(; ig != mgreater.end(); ++ig)
		std::cout << *ig << " ";

	return 0;
}
http://codepad.org/HiCRnqYb
Хм, где у тебя здесь создание ключа?и почему не используешь вектор?
З.Ы. Исходный контейнер до передачи в функцию my_sort отсортирован по возрастанию.
m9yt вне форума Ответить с цитированием
Старый 11.05.2010, 00:36   #4
ozo
Форумчанин
 
Аватар для ozo
 
Регистрация: 26.04.2010
Сообщений: 328
По умолчанию

Цитата:
Сообщение от m9yt Посмотреть сообщение
Хм, где у тебя здесь создание ключа?и почему не используешь вектор?
З.Ы. Исходный контейнер до передачи в функцию my_sort отсортирован по возрастанию.
Ммм, что-то вы не то делаете, если я вас правильно понял, то( пример на int, но мне так удобней было ):
Код:

#include <set>
#include <iostream>

class cmp{
public:
	bool operator()(int ob1, int ob2){
		return (ob1 > ob2 );
	}
};


int main(){
    std::set< int > first;
    for( int i = 0; i < 10; ++i )
	first.insert( i );

    std::copy( first.begin(), first.end(), std::ostream_iterator< int >( std::cout, "\n" ) );

    std::set< int, cmp  > second( first.begin(), first.end() );

    std::copy( second.begin(), second.end(), std::ostream_iterator< int >( std::cout, "\n" ) );
}
Либо скажите точно, что вам требуется
PS а в задании вообще multimap
Используй гугль, будь счастлив
hackme@yandex.ru
Блог об archlinux
ozo вне форума Ответить с цитированием
Старый 11.05.2010, 00:41   #5
ozo
Форумчанин
 
Аватар для ozo
 
Регистрация: 26.04.2010
Сообщений: 328
По умолчанию

Цитата:
Сообщение от m9yt Посмотреть сообщение
Привет всем.
Код:
void my_sort(multiset<country> & SET)
{
...
	for(d; d!=v.end(); d++)
		SET.insert(*d);
...
}
Какая разница в каком порядке ложить в set, оно всё равно как и было останется, нужно при создании объекта класса set задавать критерий сортировки
Используй гугль, будь счастлив
hackme@yandex.ru
Блог об archlinux
ozo вне форума Ответить с цитированием
Старый 11.05.2010, 00:48   #6
ISergeyN
Maniac
Форумчанин
 
Аватар для ISergeyN
 
Регистрация: 03.01.2009
Сообщений: 450
По умолчанию

Цитата:
Сообщение от ozo
Какая разница в каком порядке ложить в set, оно всё равно как и было останется, нужно при создании объекта класса set задавать критерий сортировки
Во-во..
Стандартные библиотеки разработаны с учетом многолетнего опыта лучших программистов и они не больны "детскими болезнями крутизны в программизме"....
ISergeyN вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сортировка Шелла и Шейкер-сортировка AleksandrMakarov Паскаль, Turbo Pascal, PascalABC.NET 11 11.03.2012 12:18
паскаль,одномерный массив,сортировка вставка,сортировка убывания,от максимального до конца немозг Помощь студентам 11 06.02.2010 21:57
Сортировка методом линейного выбора и "быстрая" сортировка Карол Помощь студентам 4 27.09.2009 19:52
Сортировка файлов в Explorer vs сортировка в Delphi mutabor Общие вопросы Delphi 11 04.09.2009 14:32