Russian Qt Forum

Программирование => С/C++ => Тема начата: sandy от Октябрь 15, 2006, 00:47



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

 :wink: Благодарю за помощь


Название: Сортировка вектора
Отправлено: Ulysses от Октябрь 15, 2006, 10:23
Библиотечными средствами можно сортировать только "внутренние векторы". То есть если имеется вектор векторов, в который эти самые векторы добавляются (скажем, push_back), то к этим добавленным можно применить алгоритм sort. Типа

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

Если назвать это сортировкой "по записи", то есть как бы по строкам, то сортировку "по полям" (по столбцам) надо делать вручную.


Название: Сортировка вектора
Отправлено: sandy от Октябрь 15, 2006, 12:37
Цитата: "Ulysses"
"по полям" (по столбцам) надо делать вручную.


Жаль, конечно, что библиотечных средств нету.
Наверное, если писать сортировку вручную, то, может, стоит подумать писать динамический массив, вместо вектора?


Название: Сортировка вектора
Отправлено: Ulysses от Октябрь 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 от Октябрь 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 от Октябрь 17, 2006, 14:57
как я понимаю что бы отсортировать для вектора надо просто переопределить функцию сортировки и тогда сортируй по любому полю


Название: Сортировка вектора
Отправлено: sandy от Октябрь 20, 2006, 12:23
Цитата: "Admin"
как я понимаю что бы отсортировать для вектора надо просто переопределить функцию сортировки и тогда сортируй по любому полю


Можно по-подробнее о переопределении функции сортировки?