предикат сортировки не передает ссылки на проиндексированные объекты? - PullRequest
0 голосов
/ 18 сентября 2018

У меня есть несколько параллельных массивов.Я не хочу создавать новый массив, который бы объединял их все, поэтому я создал индексный массив, который я хочу отсортировать на основе содержимого одного из параллельных массивов.Однако, если я попытаюсь получить индекс переданных индексов, они не будут ссылками на исходный вектор.

Например:

#include <iostream>
#include <vector>
#include <algorithm>
#include <assert.h>

using namespace std;

int main()
{

    vector<int> original = { 4, 3, 5, 2, 7 };
    vector<size_t> indices;
    size_t length = original.size();
    indices.reserve(length);
    for(size_t i = 0; i < original.size(); ++i) {
      indices.push_back(i);
    }

    sort(indices.begin(), indices.end()
      , [&] (size_t& lhs, size_t& rhs) {
        assert(&indices.front() <= &lhs && &lhs <= &indices.back());
        assert(&indices.front() <= &rhs && &rhs <= &indices.back());
        size_t iLhs = &lhs - &indices.front();
        size_t iRhs = &rhs - &indices.front();
        return original[iLhs] < original[iRhs];
    });

    for(auto index : indices) {
        cout << original[index] << endl;
    }

    return 0;
}

Демонстрация

Что не так с сообщением:

a.out: main.cpp:22: main()::<lambda(size_t&, size_t&)>: Assertion `&indices.front() <= &lhs && &lhs <= &indices.back()' failed.

С чего бы это?Означает ли это, что std::sort создает копии объектов, когда явно сказано использовать ссылку в предикате?Разве это не неэффективно?

1 Ответ

0 голосов
/ 18 сентября 2018

Мне не понятно, зачем вам линии

    size_t iLhs = &lhs - &indices.front();
    size_t iRhs = &rhs - &indices.front();

вообще. Удалить их. Упростите ваш звонок до

sort(indices.begin(), indices.end(),
     [&] (size_t lhs, size_t rhs) {
         return original[lhs] < original[rhs];
     });
...