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