从图形复制到向量后顶点数增加
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();
输出:
- 图中的顶点数:139
- 初始化后的向量大小:139
- 复制后的矢量大小:278
我尝试了 '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;
}
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);
我正在尝试将所有顶点从 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
- 初始化后的向量大小:139
- 复制后的矢量大小:278
我尝试了 '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;
}
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);