如何初始化pre-C++ 11语法中的向量向量?
问题描述:
我已经阅读了大量有关这个确切主题的问题和答案,但他们都没有帮助我弄清楚这一点。如何初始化pre-C++ 11语法中的向量向量?
我已经矢量的矢量被使用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]);
+0
这是非常脆弱的代码。维护人员非常容易无意中将事情弄糟。 –
答
基本代码如下所示。更快的备选方案可避免重复拨打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
我偶然发现的问题。因此可能存在可重用性问题,但它显示了总体思路(和它的工作原理)。 (2)我只用MinGW g ++(tdm64-1)5.1.0编译它。
不幸的是,我想你需要创建一个'vector',因此另一个'vector',一次填充后面的'push_back',并将其推回到前者,以此类推其他# – skypjack
将你的编译器转换成一个兼容C++ 11的版本:)当然在开玩笑...... – vsoftco