我的数据结构类似于无序队列,vector
填充了class A
的对象。我想一次一个元素填充队列(使用push()函数),并指向向量中的每个对象。
此实施需要:
我现在一直在靠墙撞墙几个小时,试图解决这个问题。现在我有两个解决方案,由于不同的原因都失败了。
第一个是
for(auto i = vector.begin(); i < vector.end(); i++)
{
queue->push(new A (*i));
}
这个工作完美无缺,直到编辑vector
中的元素为止,此时我意识到它似乎对队列中的值没有任何影响。也许指针在某处解耦了。
第二个是
for(A* ptr = vector.data(); ptr <= (vector.data()+vector.size()-1); ptr++)
{
A** bar = new A*;
*bar = ptr;
queue->push(*bar);
}
我可以说,这个成功地将指针与vector
中的对象进行了匹配,但由于某些其他原因,我无法判断在对队列执行一些额外操作后导致核心堕胎(pop( ),max()等)。
如果有人可以提供任何建议,我会非常感激。
哦,在我忘记之前,我希望尽可能多地使用shared_pointers
或unique_pointers
或boost
,我将此限制为STL和{{1} },vector
和list
。没有其他容器。
答案 0 :(得分:1)
您的第一个和第三个要求可以通过指针来满足,并且实施并不困难。我建议你做的是不要使用auto
因为它会给你一个迭代器对象并将其转换为指针可能很难。
关于你的第二个要求,不能这样做,因为向向量添加内容可以触发重新分配内存以增加向量容量,除非你知道向量应该预先保存的最大对象数。为了满足您的所有要求,最好的解决方案是&#34;链接&#34;通过使用向量索引而不是指针来对象。这也更简单。
但话又说回来,如果你从向量中删除东西,那么你必须更新整个队列。允许你做几乎所有事情的最灵活的解决方案是使用列表而不是向量。但它可能会对性能产生影响,您必须在做出选择之前进行思考。
为了使它能够使用向量和指针,我会这样做:
class A { /* your class here */ };
vector<A> vec;
/* Avoid vector reallocating memory. */
vec.reserve(MAX_NUMBER_OF_OBJECTS);
/* Then, populate the vector. */
/* No need for fully populating it though. */
/* ... */
/* Populate the queue. */
queue<A*> q;
for(int i = 0; i < vec.size(); i++){
q.push(&vec[i]);
}