从图形复制到矢量后顶点数量增加

时间:2015-08-12 11:23:34

标签: c++ boost adjacency-list

我正在尝试将所有顶点从boost::adjacency_list复制到std::vector 但是在这样做之后,std::vector个顶点的数量增加了两倍 代码示例:

typedef boost::adjacency_list<boost::listS, boost::vecS> revision_graph;
typedef boost::graph_traits<revision_graph>::vertex_descriptor vertex;

revision_graph graph;
int verticesNumb = num_vertices(graph);
std::cout << "NUMBER OF VERTICES IN GRAPH: " << verticesNumb << "\n";
std::vector< vertex > *rVector = new std::vector< vertex >(verticesNumb);
std::cout << "VECTOR SIZE AFTER INIT: " << rVector->size();
BGL_FORALL_VERTICES(v, graph, revision_graph)
{
    rVector->push_back(v);
}
std::cout << "VECTOR SIZE AFTER COPYING: " << rVector->size();

输出:

  • 图表中的数字:139
  • INIT后的矢量大小:139
  • 复制后的矢量大小:278

我尝试过将'顶点'复制到矢量的不同方法,但结果是一样的:

boost::graph_traits< revision_graph >::vertex_iterator vi, vi_end;
for(boost::tie(vi, vi_end) = boost::vertices(graph); vi != vi_end; ++vi)
{
    rVector->push_back(*vi);
}

那么,我应该怎么做呢? 我非常感谢你的帮助!

2 个答案:

答案 0 :(得分:1)

创建矢量后,它的大小为verticesNumb。 然后,您push_back另外verticesNumb个元素,总计在2 * verticesNumb

考虑这个简单的例子:

#include <vector>
#include <iostream>

int main()
{
    const int size = 100;
    std::vector<int> vec(size);

    for (int i = 0; i<100; ++i)
    {
        vec.push_back(i);
    }

    std::cout << vec.size() << std::endl;
    return 0;
}

<强> output

200

解决方案:不要设置初始大小,而是设置reserve

std::vector< vertex > *rVector = new std::vector< vertex >();
rVector->reserve(verticesNumb);

答案 1 :(得分:1)

这里是初始化大小为verticesNumb

的向量
std::vector< vertex > *rVector = new std::vector< vertex >(verticesNumb);

稍后您将使用push_back添加到向量的末尾。这就是为什么它的两倍超过你的期望。

在矢量上使用reserve:

std::vector< vertex > *rVector = new std::vector< vertex >();
rVector ->reserve(verticesNumb);