C++ 中的向量初始化
vector initialization in c++
有人可以向我解释为什么 Graph 构造函数中的 verticies.size(( 等于 '4' 但在 addEdge verticies.size(( 中再次调用时等于 0? 程序在顶点[fromVertex].addEdge(toVertex(处崩溃,因为顶点的大小为0。
我确信这是我应该知道的事情,但我不知道我哪里出错了。
class Vertex {
public:
int value;
vector<int> adj;
bool isVisited = false;
Vertex(int _value)
{
value = _value;
}
void addEdge(int destination)
{
adj.push_back(destination);
}
};
class Graph
{
public:
int vertexCount; // No. of vertices
vector<Vertex> verticies;
Graph(int _vertexCount)
{
this->vertexCount = _vertexCount;
vector<Vertex> verticies;
for (size_t i = 0; i < _vertexCount; i++)
{
Vertex v = Vertex(i);
verticies.push_back(v);
}
cout << "verticies count " << verticies.size() << endl;
}
void addEdge(int fromVertex, int toVertex)
{
cout << "verticies count in addEdge: " << verticies.size() << endl;
verticies[fromVertex].addEdge(toVertex);
}
void findPath(int fromVertex, int toVertex, vector<int> pathSoFar)
{
pathSoFar.push_back(fromVertex);
if (fromVertex == toVertex)
{
for (int i = 0; i < pathSoFar.size(); i++)
{
cout << pathSoFar.at(i) << " ";
}
cout << endl;
return;
}
else
{
for (size_t i = 0; i < verticies[fromVertex].adj.size(); i++)
{
int nextToVisit = verticies[fromVertex].adj.at(i);
if (verticies[nextToVisit].isVisited == false)
{
findPath(nextToVisit, toVertex, pathSoFar);
}
}
}
}
};
int main()
{
// Create a graph given in the above diagram
Graph g(4);
g.addEdge(0, 1);
g.addEdge(0, 2);
g.addEdge(1, 2);
g.addEdge(2, 0);
g.addEdge(2, 3);
g.addEdge(3, 3);
vector<int> path;
g.findPath(2, 1, path);
return 0;
}
有人可以向我解释为什么 verticies.size(( 在图构造函数中 等于'4',但在addEdge verticies.size((中再次调用时等于0?
这是因为这是两个不同的对象。这里
Graph(int _vertexCount)
{
this->vertexCount = _vertexCount;
vector<Vertex> verticies;
// ....
}
您正在创建一个名为verticies
的局部向量,该向量隐藏成员变量。只需删除该行应该没问题。我的意思是你已经声明了成员,没有必要;)做两次。
此外,我建议您在用数据填充矢量之前调整矢量的大小,或者至少保留到所需的容量。
在这里,您正在隐藏您的类字段:
Graph(int _vertexCount)
{
this->vertexCount = _vertexCount;
vector<Vertex> verticies; // <--- exactly here
for (size_t i = 0; i < _vertexCount; i++)
{
Vertex v = Vertex(i);
verticies.push_back(v);
}
cout << "verticies count " << verticies.size() << endl;
}
并且您正在本地(在构造函数的上下文中(verticies
而不是Graph::verticies
上执行所有操作。顺便说一句,正确的英语复数形式是vertices
.
相关文章:
- 如何使用C++初始化向量;脚本化值不是数组、指针或矢量错误
- 在C++中初始化向量映射的最有效方法
- 我使用向量来创建类对象列表.初始化向量时如何使用参数调用构造函数?
- 用向量的向量元素初始化向量的空向量
- 初始化向量数组,其中每个向量的大小为 0
- 如何初始化向量<unordered_map<*,*>>
- 如何在元组初始化向量中删除样板?
- C++ 通过函数声明后初始化向量
- 特征::向量;在函数中使用 Eigen::Matrix3f 的值初始化向量,大于 4 个条目
- 使用所述填充构造函数初始化向量中的向量
- 制作可用于初始化向量的迭代器
- 如何使用sregex_token_iterator对象初始化向量
- 用空向量 c++ 的 M 元素初始化向量
- 用reference_wrapper本地初始化向量
- 将向量元素与字符串元素进行比较,而不初始化向量
- 使用 reference_wrappers 初始化向量
- 从不同类型的容器的迭代器初始化向量
- 在具有容量/调整大小的类中初始化向量
- 在头文件中声明和初始化向量
- 错误:调用'begin(long double [nPoints])'没有匹配函数;使用硬编码的 int 与整数变量初始化向量