Vector迭代器在c++中不兼容

Vector iterators incompatible in c++

本文关键字:不兼容 c++ 迭代器 Vector      更新时间:2023-10-16

我正在尝试做一个与9个城市直接相连的图。我有这个问题与功能"捷径"。我总是得到一个错误"向量迭代器不兼容",我不知道是怎么回事。请帮忙。由于

功能如下:

void City::shortPath( vector<City*> & cities )
{
queue<City*> q;
q.push(this);
for( unsigned int i = 0; i < cities.size(); i++ )
{
    cities[i]->cityDistance = -1;
    cities[i]->visited1 = false;
}
q.front()->visited1 = true;
q.front()->cityDistance = 0;
while( !q.empty() )
{
    City * v = q.front();
    if( v->neighbor1.size() != 0 )
    {
        for( unsigned int i = 0; i < v->neighbor1.size(); i++ )
        {
            City * z = v->neighbor1[i];
            q.push( z );
            if( z->visited1 == false )
            {
            v->neighbor1[i]->cityDistance = v->cityDistance + 1; 
                v->neighbor1[i]->previous1.push_back( *v );
                v->neighbor1[i]->visited1 = true;
            }
        }

    }
    q.pop();
}


}

这是主要的:

int main()
{

City * NewDelhi = &City( "New Delhi" );
City * HongKong = &City("Hong Kong");
City * Washington = &City("Washington");
City * Dublin = &City("Dublin");
City * Lisbon = &City("Lisbon");
City * Vienna = &City("Vienna");
City * Santiago = &City("Santiago");
City * RioDeJaneiro = &City("RioDeJaneiro");
City * Berlin = &City( "Berlin" );
City * NewYork = &City( "NewYork" );

vector<City*> vector1;
vector1.push_back(HongKong);
vector1.push_back(NewDelhi);
vector1.push_back(Washington);
vector1.push_back(Dublin);
vector1.push_back(Lisbon);
vector1.push_back(Vienna);
vector1.push_back(Santiago);
vector1.push_back(RioDeJaneiro);
vector1.push_back(Berlin);
vector1.push_back(NewYork);

(*HongKong).neighbor1.push_back( NewDelhi );
(*NewDelhi).neighbor1.push_back( Washington);
(*Washington).neighbor1.push_back( Dublin );
(*Dublin).neighbor1.push_back( Lisbon );
(*Lisbon).neighbor1.push_back( Vienna );
(*Vienna).neighbor1.push_back( Santiago );
(*Santiago).neighbor1.push_back( RioDeJaneiro );
(*RioDeJaneiro).neighbor1.push_back( Berlin );
(*Berlin).neighbor1.push_back( NewYork );
(*NewYork).neighbor1.push_back( HongKong );


(*NewYork).shortPath( vector1 );

正如Zan Lynx在上面提到的…你使用了错误的指针。

我写了一个快速测试,有g++的输出

make a
g++     a.cpp   -o a
a.cpp: In function ‘int main()’:
a.cpp:15:35: error: taking address of temporary [-fpermissive]
make: *** [a] Error 1

正如你所看到的,它告诉我获取临时对象的地址是不好的。不仅如此,它实际上并没有编译,因为这是一个错误。我绝对可以做得更好!

我的测试代码,以防万一:

#include <iostream>
class City
{
public:
  City(const std::string& name) : name_(name) { std::cout << "Constructed" << std::endl; }
  ~City() { std::cout << "Destructed" << std::endl; }
private:
  const std::string name_;
};
int main()
{
  std::cout << "Started" << std::endl;
  City *SF = &City("San Francisco");
  char c;
  std::cin >> c;
}

当您尝试使用属于同一类型的另一个向量的迭代器时,可能会发生这种情况。在某些情况下,您可能会复制vector对象,但是您可以使用来自原vector对象的迭代器来复制新对象。

在这种情况下,错误是由于将vector的副本与属于原始vector的迭代器一起传递给函数,从而返回vector 的副本而导致的。您需要检查代码,并查看vector和迭代器是如何传递的。任何复制的地方都可能是问题的根源。

同样,正如Roy所指出的,如果在对某些容器执行修改后持有旧的迭代器,也可能发生这种情况。在vector的情况下,任何时候你添加或删除一个元素,内部存储可能需要调整大小,导致所有迭代器失效。任何使用这些迭代器的尝试都会导致未定义的行为,任何事情都可能发生。

通常是因为你在保存迭代器后做了一些动作改变了向量,例如插入/擦除,先前保存的迭代器不再有效。

检查你的代码,看看是不是这样