Хорошо, теперь вы, вероятно, знаете, что 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;
}
person
tomasz
schedule
29.07.2011
Comp
должен содержать ссылку на вектор, а не копировать его. - person Tim   schedule 29.07.2011