有什么方法可以在 C++ 中创建匿名引用容器?
Any way to create an anonymous reference container in C++?
在python中,我们可以简单地使用这样的代码:
a = [1,2,3]
b = [4,5,6]
for m in [a, b]:
for e in m:
print(e)
"[a, b]
"是一个"匿名"容器,里面包含了a和b的"reference",在遍历的时候,会创建none个附加列表,这样遍历非常有效.
有没有办法在 C++ 中做同样的事情?我试过用 vector 来做,但是 vector 总是复制对象而不是推理,我还没有找到这样的“匿名”方式来做。
不确定您使用的是什么 C++。
C++17 以后可以这样做:
#include <vector>
#include <functional>
#include <iostream>
int main(int, char*[])
{
std::vector a{1,2,3};
std::vector b{3,4,5};
for ( auto&& v : std::vector{std::ref(a), std::ref(b)}) {
for (int& el : v.get()) {
std::cout <<el<<'\n';
}
}
}
https://godbolt.org/z/8rvh6snz1
C++11和C++14版本其实是一样的,只是少了模板推导,所以都变长了:
std::vector<int> a{1,2,3};
std::vector<int> b{3,4,5};
std::vector<std::reference_wrapper<std::vector<int>>> m{std::ref(a), std::ref(b)};
A for C++98...没有范围for循环,参考包装由Boost提供:
#include <vector>
#include <iostream>
#include <boost/core/ref.hpp>
int main(int, char*[])
{
std::vector<int> a;
a.push_back(1);
a.push_back(2);
a.push_back(3);
std::vector<int> b;
b.push_back(4);
b.push_back(5);
b.push_back(6);
std::vector<boost::reference_wrapper<std::vector<int> > > m;
m.push_back(boost::ref(a));
m.push_back(boost::ref(b));
for(std::vector<boost::reference_wrapper<std::vector<int> > >::iterator it=m.begin(), e=m.end();
it!=e; ++it) {
for(std::vector<int>::iterator ii=(*it).get().begin(), ie=(*it).get().end();
ii!=ie; ++ii) {
std::cout << *ii << '\n';
}
}
}
https://godbolt.org/z/3n8jobz4h
Boost 还提供了许多其他方便的功能,请随时仔细查看。我只是想将它的使用限制在最低限度。
在python中,我们可以简单地使用这样的代码:
a = [1,2,3]
b = [4,5,6]
for m in [a, b]:
for e in m:
print(e)
"[a, b]
"是一个"匿名"容器,里面包含了a和b的"reference",在遍历的时候,会创建none个附加列表,这样遍历非常有效.
有没有办法在 C++ 中做同样的事情?我试过用 vector 来做,但是 vector 总是复制对象而不是推理,我还没有找到这样的“匿名”方式来做。
不确定您使用的是什么 C++。
C++17 以后可以这样做:
#include <vector>
#include <functional>
#include <iostream>
int main(int, char*[])
{
std::vector a{1,2,3};
std::vector b{3,4,5};
for ( auto&& v : std::vector{std::ref(a), std::ref(b)}) {
for (int& el : v.get()) {
std::cout <<el<<'\n';
}
}
}
https://godbolt.org/z/8rvh6snz1
C++11和C++14版本其实是一样的,只是少了模板推导,所以都变长了:
std::vector<int> a{1,2,3};
std::vector<int> b{3,4,5};
std::vector<std::reference_wrapper<std::vector<int>>> m{std::ref(a), std::ref(b)};
A for C++98...没有范围for循环,参考包装由Boost提供:
#include <vector>
#include <iostream>
#include <boost/core/ref.hpp>
int main(int, char*[])
{
std::vector<int> a;
a.push_back(1);
a.push_back(2);
a.push_back(3);
std::vector<int> b;
b.push_back(4);
b.push_back(5);
b.push_back(6);
std::vector<boost::reference_wrapper<std::vector<int> > > m;
m.push_back(boost::ref(a));
m.push_back(boost::ref(b));
for(std::vector<boost::reference_wrapper<std::vector<int> > >::iterator it=m.begin(), e=m.end();
it!=e; ++it) {
for(std::vector<int>::iterator ii=(*it).get().begin(), ie=(*it).get().end();
ii!=ie; ++ii) {
std::cout << *ii << '\n';
}
}
}
https://godbolt.org/z/3n8jobz4h
Boost 还提供了许多其他方便的功能,请随时仔细查看。我只是想将它的使用限制在最低限度。