创建一系列向量C ++

时间:2011-09-12 15:21:12

标签: c++ vector map

在我的问题中,向量表示形式

的结构向量
struct node 
      {string key; 
       int a,b; };

我想对以下内容进行编码:假设用户指定的数字为d,我想创建一系列d向量v_1, v_2, ...v_d

v_1是根据用户数据创建的,v_i来自v_(i-1) i>=2v_i大小v_(i-1)中具有不同key字段的节点数。 a节点的bv_i字段是根据v(i-1)

中的某些黑盒算法计算得出的

我应该如何在C ++中高效编码? 我应该使用表格的地图吗? map<int, vector<nodes>>其中int字段在1d ??

之间变化

谢谢!

P:S: 我想我们可以使用new运算符和一些指针体操来代码解决方案,而不是使用向量。但我希望尽可能使指针解决方案。

2 个答案:

答案 0 :(得分:2)

鉴于您需要范围0..d,为什么不将std::vector<std::vector<node> >作为您的容器类型?

答案 1 :(得分:1)

使用std::vector<std::vector<node> >,但智能地使用vector::reserve()以避免重新分配:

using std::vector;
vector<vector<node>> v(d); // 0 nodes allocated, no wasted space yet

using std::copy;
using std::istream_iterator;
using std::back_inserter;
// Wish I could v[0].reserve(), but we don't have that info yet.
copy(istream_iterator<node>(std::cin), istream_iterator<node>(), back_inserter(v[0]));

// foreach v[1..d-1], compute v[i] from v[i-1]
for(int i = 1; i < d; ++i) {
    int size = ComputeSize(v[i-1]); // how big a list do we need?
    v[i].reserve(size);  // reserve the space for it, and 
    PopulateVectorFromVector(v[i-1], v[i]); // fill it in.
}

浪费空间和时间的唯一向量是v [0]。

<小时/> 编辑:上面对std::copy的调用是一个无循环的成语,大致相当于

node tmp;
while(std::cin >> tmp) {
    v[0].push_back(tmp);
}

std::copy有三个参数。前两个是input iterators,它们定义了我们复制的范围,而第三个是定义目的地的output iterator

具体来说,istream_iterator<node>(std::cin)是一个输入迭代器,当解除引用时,从标准输入流中读取下一个nodeback_inserter(v[0])是一个输出迭代器,在取消引用并分配给它时,会调用v[0].push_back()