有什么方法可以在 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 还提供了许多其他方便的功能,请随时仔细查看。我只是想将它的使用限制在最低限度。