Russian Qt Forum
Май 28, 2024, 16:37 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Сортировка вектора  (Прочитано 9214 раз)
sandy
Гость
« : Октябрь 15, 2006, 00:47 »

:roll: Как, собственно, сортируется вектор я знаю.
 :?: А если он такого вида: std::vector<std::vector<char*>ve >v;
 :?: Можно ли отсортировать его по полю?
 :?: Будет сортироваться только данное поле или вектор?

 :wink: Благодарю за помощь
Записан
Ulysses
Гость
« Ответ #1 : Октябрь 15, 2006, 10:23 »

Библиотечными средствами можно сортировать только "внутренние векторы". То есть если имеется вектор векторов, в который эти самые векторы добавляются (скажем, push_back), то к этим добавленным можно применить алгоритм sort. Типа

sort(vect2d.begin(), vect2d.end());

Если назвать это сортировкой "по записи", то есть как бы по строкам, то сортировку "по полям" (по столбцам) надо делать вручную.
Записан
sandy
Гость
« Ответ #2 : Октябрь 15, 2006, 12:37 »

Цитата: "Ulysses"
"по полям" (по столбцам) надо делать вручную.


Жаль, конечно, что библиотечных средств нету.
Наверное, если писать сортировку вручную, то, может, стоит подумать писать динамический массив, вместо вектора?
Записан
Ulysses
Гость
« Ответ #3 : Октябрь 15, 2006, 16:58 »

А вы считаете, что станет легче? - Не уверен. qsrot() ведь тоже не запустишь "по столбцам".  Алгоритм, который придется реализовывать не меняется. Все зависит от того, чем вы лучше и увереннее пользуетесь. Писать ли char *** или std::vector<std::vector<char*> > - это, так сказать, вопрос религиозных убеждений. Я-то лично симпатизирую более высокоуровневым средствам (в данном случае - STL). Общеизвестным является тот факт, что огромная доля ошибок при C-style programming происходит из-за некорректной работы с динамической памятью (утечкам подвержено даже профессиональное ПО).

Охота ли возиться с умными указателями, которые тоже не являются панацеей, но вносят дополнительную сложность в программу? Опять же: если есть опыт и уверенность при их использовании (или желание такой опыт получить Улыбающийся) - вперед.

Так как тип элементов(char *) легкий, то можно сделать так. Написать функцию сортировки, которая бы копировала элементы указанного столбца двумерного массива в вектор и применяла к нему sort(), а затем осуществляла бы обратное копирование. Чтобы каждый раз память под такой вектор не выделять, его можно сделать статическим. И при каждом входе в функцию проверять: если количество строк в матрице изменилось, то resize() этому вектору.

Кстати использование vector<char *> - это смешение стилей, что, на мой взгляд, куда хуже, чем пользование пусть устаревшим, но единым стилем. Подумайте над вариантом vector<string>. Тогда правда, мое предложение по поводу сортировки столбца, примененное непосредственно, становится очень дорогим (копирование строк). Может быть vector<string *>.
Записан
bigirbis
Гость
« Ответ #4 : Октябрь 17, 2006, 09:28 »

Если полная сортировка, то в данном случае можно сделать только в 2 захода:
1. Сортировка на втором уровне, что-то типа (давно не писал):
Код:
std::for_each( v.begin(), v.end(), sort_vec < std::vector<char*> >() );

2. На первом уровне нужно переопределить операцию сравнения для std::vector<char*>:
Код:
std::sort( v.begin(), v.end(), less< std::vector<char*> >() );
Записан
Admin
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1988



Просмотр профиля
« Ответ #5 : Октябрь 17, 2006, 14:57 »

как я понимаю что бы отсортировать для вектора надо просто переопределить функцию сортировки и тогда сортируй по любому полю
Записан
sandy
Гость
« Ответ #6 : Октябрь 20, 2006, 12:23 »

Цитата: "Admin"
как я понимаю что бы отсортировать для вектора надо просто переопределить функцию сортировки и тогда сортируй по любому полю


Можно по-подробнее о переопределении функции сортировки?
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.06 секунд. Запросов: 19.