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

Number of vertices increased after copying from graph to vector

我正在尝试将所有顶点从 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();

输出:

我尝试了 'copying' 顶点到向量的不同方式,但结果是一样的:

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);
}

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

创建向量后,它的大小已经是 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);

此处您正在初始化大小为 verticesNumb

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

稍后您将使用 push_back 添加到矢量的末尾。这就是为什么它比您预期的多两倍。

像这样在 vector 上使用保留:​​

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