在现代C++中将 std::array<std:::array<T,N>> 转换为 std::vector<T>



我有一个三角形,由 3d 向量 (std::vector<Vector3>( 和索引的向量表示,表示

如下
using int3 = std::array<int, 3>;
std::vector<int3> indices;

我需要将indices转换为std::vector<size_t>格式才能与库进行交互。

我知道如何使用原始循环来做到这一点,但我想在这里介绍如何使用算法来做到这一点。我尝试了类似的东西

std::vector<size_t> indices_converted;
std::transform(std::begin(indices), std::end(indices), std::back_inserter(indices_converted), [](const auto &v) {
});

但这还不够,因为我无法一次将三个值插入indices_converted向量中。

那么,你有什么想法?

使用最新版本的 range-v3 库的单行代码:

#include <array>
#include <vector>
#include <range/v3/view/join.hpp>
#include <range/v3/range/conversion.hpp>
// ...
std::vector<std::array<int, 3>> v = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
const auto result = ranges::views::join(v) | ranges::to<std::vector>();

在神霹雳上

您可以使用基于范围的 for 循环或标准算法std::for_each

例如

#include <iostream>
#include <array>
#include <vector>
#include <iterator>
int main() 
{
using int3 = std::array<int, 3>;
std::vector<int3> indices = 
{
{ 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 }
};
std::vector<size_t> indices_converted;
indices_converted.reserve( 3 * indices.size() );
for ( const auto &item : indices )
{
indices_converted.insert( std::end( indices_converted ), std::begin( item ), std::end( item ) );
}
for ( const auto &item : indices_converted ) std::cout << item << ' ';
std::cout << 'n';
return 0;
}

#include <iostream>
#include <array>
#include <vector>
#include <iterator>
#include <algorithm>
int main() 
{
using int3 = std::array<int, 3>;
std::vector<int3> indices = 
{
{ 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 }
};
std::vector<size_t> indices_converted;
indices_converted.reserve( 3 * indices.size() );
std::for_each( std::begin( indices ), std::end( indices ),
[&indices_converted]( const auto &item )
{
indices_converted.insert( std::end( indices_converted ), std::begin( item ), std::end( item ) );        
} );
for ( const auto &item : indices_converted ) std::cout << item << ' ';
std::cout << 'n';
return 0;
}

在这两种情况下,输出都是

1 2 3 4 5 6 7 8 9 

相关内容

最新更新