在我通过构造函数传递之后,为什么我的向量会发生变化?

时间:2013-12-19 02:25:33

标签: c++ pointers vector

如果查看输出,您可以看到listOrder的内容是什么,这些是正确的内容。但是,只要我将它传递给我的图形构造函数并输出相同的列表,我就会乱七八糟。我怀疑这与我的Vertex *内容的adjacencyList有关,但我不明白我的指针是如何混乱的。请帮我把正确的节点放到图形矢量中!

for (vector<char>::iterator it=listOrder.begin(); it!=listOrder.end(); ++it)
{
    cout << "ListNode: " << *it << endl;
}
Graph graph(listOrder, adjacencyList);
for (vector<char>::iterator it=graph.getOrder().begin(); it!=graph.getOrder().end(); ++it)
{
    cout << "Node: " << *it << endl;
}

构造函数

Graph::Graph(vector<char> newVertices, map<char, Vertex*> newAL)
{
vertices = newVertices;
adjacencyList = newAL;
}

GetOrder功能

vector<char> Graph::getOrder()
{
return vertices;
}

输出

ListNode: A
ListNode: B
ListNode: C
ListNode: D
ListNode: E
ListNode: F
ListNode: G
Node: ░
Node: ↨
Node: >
Node:
Node: ─
Node:
Node: >

3 个答案:

答案 0 :(得分:3)

每次调用getOrder时都会返回向量的副本,因此迭代器不是来自同一个容器。

通过引用从getOrder返回向量,或者只调用getOrder一次以获取向量的副本,然后遍历该向量。

类似的东西:

vector<char> v(graph.getOrder());
for (vector<char>::iterator it=v.begin(); it!=v.end(); ++it)
{
    cout << "Node: " << *it << endl;
}

答案 1 :(得分:0)

我建议使用基于范围的。它可以帮助您避免遇到的一些问题。

你的getOrder函数在每次调用时返回一个不同的向量,这意味着你无法有效地比较一次调用的迭代器。

如果您重新编写代码,那就是这样的:

for (auto &it : listOrder)
{
    cout << "ListNode: " << it << endl;
}
Graph graph(listOrder, adjacencyList);
for (auto &it : graph.getOrder())
{
    cout << "Node: " << it << endl;
}

它将有更好的工作机会。

答案 2 :(得分:0)

使用复制构造函数初始化类成员

Graph::Graph(vector<char> newVertices, map<char, Vertex*> newAL)
: vertices(newVertices)
, adjacencyList(newAL)
{}