填充指向矢量元素的无序指针队列

时间:2015-10-23 18:36:39

标签: c++ pointers vector

我的数据结构类似于无序队列,vector填充了class A的对象。我想一次一个元素填充队列(使用push()函数),并指向向量中的每个对象。

此实施需要:

  1. 跟踪向量中对象的原始顺序,即使存储在队列中的指针根据比较器和对象的值交换位置
  2. 允许向对象继续添加对象(同样,注意顺序)
  3. 允许根据矢量中的原始顺序编辑对象,而无需将所有内容重新复制到队列中(因此,指针队列而不是对象)
  4. 我现在一直在靠墙撞墙几个小时,试图解决这个问题。现在我有两个解决方案,由于不同的原因都失败了。

    第一个是

    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_pointersunique_pointersboost,我将此限制为STL和{{1} },vectorlist。没有其他容器。

1 个答案:

答案 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]);
}