如何在c++ 11语法中初始化向量的向量
How to initialize a vector of vectors in pre c++ 11 syntax?
我已经阅读了大量关于这个主题的问题和答案,但没有一个能帮我弄清楚这个问题。
我有一个用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进行编译。
相关文章:
- 为什么我在向量初始化时收到此错误?
- 使用向量初始化参数化构造函数的对象数组
- C++向量初始化遗传算法的代理向量
- shared_ptr类的向量的向量初始化问题
- 如何实现使用 gcc-4.4 编译的大向量初始化?
- 使用向量初始化C++中的链表
- C++ 中的向量初始化
- 如何使用嵌套初始化构造函数中的一维向量初始化矩阵
- std::另一个函数中的向量初始化
- 理解向量初始化时出现问题
- 静态常量 std::<char>没有堆的向量初始化?
- 向量初始化在 C++ 类中失败
- 具有从特定范围的随机数初始化特征矩阵或向量初始化特征矩阵或向量的有效方法
- 关于向量初始化的一些问题
- 了解C 中的向量初始化
- 设置::使用数字中的引号进行向量初始化
- VS2010中的向量初始化
- C++:构造函数中的向量初始化
- 如何从向量初始化数组?(如何将指针强制转换为数组?)
- 给我一个向量初始化的提示或(答案)