Название: Сортировка вектора Отправлено: 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" как я понимаю что бы отсортировать для вектора надо просто переопределить функцию сортировки и тогда сортируй по любому полю Можно по-подробнее о переопределении функции сортировки? |