0

我想将多个范围(eqvectors)连接到一个范围内,而不是将它们复制到新容器中,这样性能会更好。

它用于稍后在整个范围内进行迭代。

#include <iostream>
#include <vector>

#include <boost/range/adaptors.hpp>
#include <boost/range.hpp>

const std::vector<int> vec1 = { 0, 1, 2, 3 };
const std::vector<int> vec2 = { 10, 11, 12, 13 };
const std::vector<int> vec3 = { 20, 21, 22, 23 };
const std::vector<int> vec4 = { 30, 31, 32, 33 };
std::vector< std::vector<int>> all{vec1, vec2, vec3, vec4};


int main() {
   auto range = boost::adaptors::transform( all, [&](auto &v) {
     return boost::make_iterator_range( v );  
   } );
   
   for( const auto &i:range) {
    std::cout << i << ", ";   
   }
}

上面打印了这个;

0123, 10111213, 20212223, 30313233,  

但我真正想要的是这个;

0, 1, 2, 3, 10, 11, 12, 13, 20, 21, 22, 23, 30, 31, 32, 33,  
4

2 回答 2

1

如果您可以使用 C++20 范围而不是 boost,那么您可以这样做:

auto range = all | std::views::join

同样适用于 range-v3 库。使用 range-v3 库,如果需要,您可以避免创建all

auto range = ranges::views::concat(vec1, vec2, vec3, vec4);

使用 boost,您可以执行以下操作:

auto range =
    boost::join(vec1,
        boost::join(vec2,
            boost::join(vec3, vec4)
        )
    );
于 2021-03-04T04:55:37.570 回答
0

在我给出我的旧式答案之前发表评论。就是你all在上面的代码中创建的时候已经复制了所有的向量......

一个潜在的解决方案是有一个指向向量的向量。

std::vector< std::vector<int>*> all;

然后你将所有向量的地址 push_back 到向量的向量中。只为每个向量复制一个地址比复制整个地址对性能的影响要小。

然后使用嵌套循环扫描向量的向量。

   for( auto temp:all)
     for (int element:*temp)
     {
      std::cout << element << ", ";   
     }
于 2021-03-04T04:19:45.713 回答