Как можно сохранить результат фильтрации вектора внутри другого вектора без копирования? - PullRequest
0 голосов
/ 03 февраля 2019

В C ++: допустим, у меня есть вектор const std:vector<MyStruct>, который (и его элементы) больше не будет изменяться.Теперь я хочу отфильтровать этот вектор на основе некоторого предиката и сохранить результат в каком-либо объекте, потому что я бы хотел часто выполнять итерации по этому подмножеству элементов.

Есть ли хороший способ избежать копирования MyStructsиз вектора в другой вектор и как это будет сделано?

1 Ответ

0 голосов
/ 03 февраля 2019

Это можно сделать даже с обычным STL, используя несколько стандартных типов, reference_wrapper, что особенно важно:

#include <iostream>
#include <vector>
#include <functional>
#include <iterator>
#include <algorithm>

int main() {
    std::vector<int> cv{0, 1, 2, 3, 4, 5};
    std::vector<std::reference_wrapper<int>> fv;
    std::copy_if(cv.begin(), cv.end(), std::back_inserter(fv)
        , [](int x){ return x % 2; });
    for(auto const &v: fv) std::cout << v << '\n';
    std::cout << "-----\n";
    cv[3] = 42;
    for(auto const &v: fv) std::cout << v << '\n';
}
$ g++ meow.cpp && ./a.out 
1
3
5
-----
1
42
5

Обратите внимание, как меняется cvотражать в fv.fv хранит, но ссылается на исходные элементы, а именно на нечетные элементы cv, поэтому копии не выполняются.

...