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




Это можно сделать даже с помощью простого 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, поэтому копирование не выполняется.
Это зависит от того, как будет работать ваше приложение. Пожалуйста, сделайте минимальный воспроизводимый пример. Так что можно говорить о чем-то конкретном.