我有一個大的std::vector<int> a
,但我只想在它的一個子集上工作。這個想法是創建一個std::vector<reference_wrapper<int> > refa
,其中只包含所述的子集(在MSE中,所有元素都是1 < a
< 4)。然後,我想通過refa
函數,期望std::vector<int>
或std::vector<int>&
作爲參數(因爲我也想用它們與a
)。 a
可能非常大,我想避免多次選擇。傳遞矢量<reference_wrapper <int>>到矢量<int>?
問題
如何正確傳遞refa
的功能呢?我想要的是bar(refa)
和foobar(refa)
工作。
有沒有更好的方法來解決問題,而不改變功能(太多)?
代碼
#include <functional>
#include <iostream>
#include <vector>
int foo(int &a)
{
a++;
return 0;
}
int bar(std::vector<int> &va)
{
for(auto &vaa : va)
vaa++;
return 0;
}
int foobar(std::vector<int> va)
{
for(auto &vaa : va)
vaa++;
return 0;
}
int main()
{
std::vector<int> a= {1, 2, 3, 4, 5};
std::vector<std::reference_wrapper<int> > refa;
//Fill refa
for(auto &aa : a)
{
if(aa>1 && aa<4) refa.push_back(std::ref(aa));
}
//works
// for(auto &aa : refa)
// aa++;
//works
// bar(a);
//works, a unchanged
// foobar(a);
//works
// for(auto &aa : refa)
// foo(aa);
//works
// for(int &aa : refa)
// foo(aa)
// does not work
// conversion from vector<reference_wrapper<int> > to vector<int>& or vector<int> required
bar(refa);
// foobar(refa);
for(auto &aa : a)
std::cout << aa << std::endl;
return 0;
}
注意 int
在這裏僅用來保持例子簡單。
也許獲得一個迭代器範圍?作爲「觀點」? –
其中1 piokuc
是的,它們可能不在連續範圍內,我不想對它們進行分類。 – Jost