在我的问题中,向量表示形式
的结构向量struct node
{string key;
int a,b; };
我想对以下内容进行编码:假设用户指定的数字为d
,我想创建一系列d
向量v_1, v_2, ...v_d
。
v_1
是根据用户数据创建的,v_i
来自v_(i-1)
i>=2
。
v_i
的大小是v_(i-1)
中具有不同key
字段的节点数。
a
节点的b
和v_i
字段是根据v(i-1)
我应该如何在C ++中高效编码?
我应该使用表格的地图吗?
map<int, vector<nodes>>
其中int字段在1
和d
??
谢谢!
P:S: 我想我们可以使用new
运算符和一些指针体操来代码解决方案,而不是使用向量。但我希望尽可能使指针解决方案。
答案 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)
是一个输入迭代器,当解除引用时,从标准输入流中读取下一个node
。 back_inserter(v[0])
是一个输出迭代器,在取消引用并分配给它时,会调用v[0].push_back()
。