【发布时间】:2014-02-11 16:44:51
【问题描述】:
我有一个很大的std::vector<int> a,但我只想处理它的一个子集。这个想法是创建一个仅包含上述子集的std::vector<reference_wrapper<int> > refa(在 mwe 中,所有元素 1arefa 传递给期望std::vector<int> 或std::vector<int>& 作为参数的函数(因为我也想将它们与a 一起使用)。 a 可能很大,我想避免多次选择。
问题
如何正确地将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
-
是的,它们可能不在连续范围内,我不想对它们进行排序。
标签: c++ c++11 vector stl reference-wrapper