Vector迭代器在c++中不兼容
Vector iterators incompatible in c++
我正在尝试做一个与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
的情况下,任何时候你添加或删除一个元素,内部存储可能需要调整大小,导致所有迭代器失效。任何使用这些迭代器的尝试都会导致未定义的行为,任何事情都可能发生。
通常是因为你在保存迭代器后做了一些动作改变了向量,例如插入/擦除,先前保存的迭代器不再有效。
检查你的代码,看看是不是这样
相关文章:
- 我收到同义重复编译器错误。我应该如何修复"类型"X"的参数与类型"X"的参数不兼容?
- 字符类型转换不兼容
- Qt:如何使不兼容的发送方/接收方参数兼容?
- 视觉工作室 2017;启用 /permissive 时,类型 "const wchar_t *" 的参数与类型 "PWSTR" 的参数不兼容
- 使用不兼容的分配器复制分配无序列图
- 类型为 "int*" 的参数与 C++ 中错误类型"int**"参数不兼容
- 该对象具有与成员函数不兼容的类型限定符.为什么会出现此错误?
- 我正在尝试将表的地址传递给要在另一个函数中使用的指针,但得到不兼容的指针类型
- 为什么范围算法与 std 的迭代器不兼容?
- Winpcap Findalldevs const char * 与 char * 不兼容
- C++ 类型的参数与 void (__cdecl*)(void) 类型的参数不兼容,当调用 std::atexit()
- 将"std::string {aka std::basic_string}"赋值中的不兼容类型<char>
- 如何在C++中停止调用不兼容的方法?
- OPENCL 警告:不兼容的指针类型将'float __global[16]'传递给类型为 '__global float4 的参数 *
- 函数范围的静态变量如何导致与共享库中函数代码的未来使用不兼容
- 如何修复"方法的类型与 PInvoke 不兼容"
- C++不兼容的迭代器类型
- 编译器错误"在if语句中分配不兼容的类型"
- 程序无法编译:将 'int (*)[3][3]' 赋值为 'int [9][3][3]' 中的不兼容类型
- boost::mpl 不使用(甚至不兼容)std::p air 的原因是什么?