@dansheb

Как сортировать два массива по одному из них в C++?

Предположим есть два (или несколько) векторов std::vector<T> (или std::array<T>) A и B одинаковой длины n.
Нужно отсортировать массивы по A, при этом переставить соответствующие элементы B. (Так делают табличные процессоры типа Excel и также обрабатываются таблицы в СУБД).

Пример для двух массивов A и B:
A B
5 R
4 Q
1 T
3 A
2 X

Сортируем по A:
A B
1 T
2 X
3 A
4 Q
5 R

Ограничения по дополнительной памяти O(1).

Из идей как это сделать средствами С++ без библиотек:
1. Скопировать std::sort и заменить в нем функцию std::swap, на свою, которая переставляет связанные элементы.
2. Перегрузить std::swap для какого-то типа, что бы использовать std::sort без изменений, но я не понимаю как это сделать, так как при обмене двух значений в std::vector<T> будет вызвана std::swap<T, T>.

Вопрос как реализовать такую сортировку просто и без переписывания лишнего кода.
Желательно без использования дополнительных библиотек. (Ответы с ними я бы тоже с удовольствием увидел).
  • Вопрос задан
  • 4681 просмотр
Решения вопроса 1
AtomKrieg
@AtomKrieg
Давай я поищу в Google за тебя
Есть такой подход web.stanford.edu/~dgleich/notebook/2006/03/sorting...

или

Положите значения в map - в нем значения сортируются по ключу

vector<int> intv{5, 4, 1, 3, 2};
vector<char> charv{'R', 'Q', 'T', 'A', 'X'};
map<int, char> res;

for (size_t idx {0} ; idx < intv.size() ; idx++)
	res[intv[idx]] = charv[idx];

for (auto kv : res)
	cout << kv.first << " " << kv.second << endl;
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@Alexander1705
Сделать вектор пар std::vector<std::pair<int, char>>, а в std::sort передавать собственный компаратор, который будет сравнивать только первые элементы:
vector<pair<int, char>> vec;
sort(vec.begin(), vec.end(), [](pair<int, char> a, pair<int, char> b){return a.first < b.first;});
Ответ написан
maaGames
@maaGames
Погроммирую программы
Сделай свой объект компаратор, в котором сохрани указатель на второй массив. В операторе сравнения не только сравнивай значения аргументов, но и меняй местами значения во втором массиве.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы