Хорошо, теперь вы, вероятно, знаете о том факте, что i
и j
являются фактическими значениями, содержащимися в vector
, а не в индексах. Для этого есть веская причина: сортировка - это значения, а не индексы. Обратите внимание, что вы передаете итераторы методу sort
, поэтому он не может извлечь индекс для вас. Конечно, вы можете получить индекс относительно первого итератора, но для этого нет никаких оснований.
Однако давайте ненадолго будем безумны и представим, что вы получите индексы, а не значения в компараторе. Предположим, что ваш код выполняет то, что вы хотите, и давайте подумаем о следующем сценарии:
v1 = {20,10}; v2 = {2,1}
Я тайно предполагаю, что вы хотите следующий вывод:
v1 = {10, 20}
право? Теперь представьте, что вы вызываете функцию сортировки, и я делаю следующие шаги:
v2[0] < v2[1]
ложно, поэтому swap(&v1[0], &v1[1])
Это отсортировано, не так ли? Но подождите, я сумасшедшая функция сортировки, поэтому я хочу убедиться, что она отсортирована, поэтому я делаю следующее:
v2[0] < v2[1]
ложно, swap(&v1[0], &v1[1])
И снова:
v2[0] < v2[1]
ложно, swap(&v1[0], &v1[1])
и снова, снова, снова ...
Вы видите проблему? У функции сортировки есть некоторые требования, и вы наверняка нарушаете фундаментальную.
Я подозреваю, что вам нужен совершенно другой контейнер (может быть std::map
с ключами от vec1
и значениями от vec2
) или, по крайней мере, что-то вроде vector< pair<double, double> >
, так что вы можете легко сортировать по первому или второму значению. Если нет, рассмотрите возможность создания vector
со значениями в диапазоне [0, v2.size())
, сортировку с использованием компаратора (значения равны индексам, поэтому все будет в порядке), а затем выведите правильные значения из v1
. Этот код отлично работает:
vector<size_t> indices;
for(size_t i =0; i < v1.size(); ++i)
{
indices.push_back(i);
}
// yes, it works using your original comparator
sort(indices.begin(), indices.end(), Comp(v2));
for(size_t i =0; i < indices.size(); ++i)
{
cout << v1.at(indices[i]) << " " << v2.at(indices[i]) << endl;
}