如何在c++ 11语法中初始化向量的向量

How to initialize a vector of vectors in pre c++ 11 syntax?

本文关键字:向量 初始化 语法 c++      更新时间:2023-10-16

我已经阅读了大量关于这个主题的问题和答案,但没有一个能帮我弄清楚这个问题。

我有一个用c++ 11代码初始化的向量的向量:

return { {1,1,1}, {1,2}, {2,1}, {3} };

我如何在尽可能少的行中将此转换为c++ 11之前的语法?

从数组中赋值或构造是一个简单的选项:

int temp[] = { 1, 1, 1, 1, 2, 2, 1, 3 };
std::vector<std::vector<int>> a(4);
a[0].assign(&temp[0], &temp[3]);
a[1].assign(&temp[3], &temp[5]);
a[2].assign(&temp[5], &temp[7]);
a[3].assign(&temp[7], &temp[8]);

基本代码如下所示。更快的替代方案可以避免对back()的重复调用,但这是最清楚的方法,可以看到它与原始代码的关系。

std::vector<std::vector<int>> a;
a.push_back(std::vector<int>());
a.back().push_back(1);
a.back().push_back(1);
a.back().push_back(1);
a.push_back(std::vector<int>());
a.back().push_back(1);
a.back().push_back(2);
a.push_back(std::vector<int>());
a.back().push_back(2);
a.back().push_back(1);
a.push_back(std::vector<int>());
a.back().push_back(3);
return a;

在c++ 03(或c++ 98)中编写可维护代码的关键思想是命名内容。总的来说,这也是一个好主意,但它可能与合理简洁的理想相冲突。也就是说,它很容易变得过于冗长,而不是完全无痛的。

在适当的支持下,可以编写像 这样的代码
namespace my{
    using std::vector;
    vector< vector< int > >
        foo()
    {
        int const a0[] = {1,1,1};
        int const a1[] = {1,2};
        int const a2[] = {2,1};
        int const a3[] = {3};
        typedef cppx::Array_range<int const> R;
        R const ranges[] = {a0, a1, a2, a3};
        return make_vecvec( ranges );
    }
}  //  namespace my
相关支持:

#include <iostream>
#include <stddef.h>     // ptrdiff_t
#include <vector>
namespace cppx {
    using std::vector;
    typedef ptrdiff_t Size;
    typedef Size Index;
    template< class Item, Size n >
    Size n_items( Item (&)[n] ) { return n; }
    template< class Type >
    struct Non_const{ typedef Type T; };
    template< class Type >
    struct Non_const< Type const > { typedef Type T; };
    template< class Item >
    struct Array_range
    {
        Item* const p_begin;
        Item* const p_end;
        template< Size n >
        Array_range( Item (&a)[n] )
            : p_begin( a )
            , p_end( a + n )
        {}
    };
    template< class Item, Size n >
    vector<typename Non_const<Item>::T>
        make_vec( Item (&a)[n] )
    {
        return vector<typename Non_const<Item>::T>( a, a + n );
    }
    template< class Item, Size n >
    vector< vector< typename Non_const<Item>::T > >
        make_vecvec( Array_range<Item> const (&a)[n] )
    {
        typedef typename Non_const<Item>::T Nc_item;
        vector< vector< Nc_item > > result;
        for( Index i = 0; i < n; ++i )
        {
            result.push_back( vector< Nc_item >(
                a[i].p_begin, a[i].p_end
                ) );
        }
        return result;
    }
}  // namespace cppx

免责声明:(1)我刚刚为这个答案输入了支持代码,修复了我偶然发现的直接const -ness问题。因此可能存在可重用性问题,但它显示了总体思想(并且它有效)。(2)我只使用mingw++ (tdm64-1) 5.1.0进行编译。