2013-05-25 69 views
0

我正在試圖與9個城市直接相連。我遇到了這個功能「短路徑」的問題。我不斷收到一個錯誤「矢量迭代器不兼容」,我無法弄清楚。請任何幫助。由於向量迭代器在C++中不兼容

這是函數:

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); 
+4

能否請您剪切/粘貼確切的錯誤信息,並指出它的存在就行了? – paulsm4

+0

我要把我的錢放在'v'虛假引用:'v-> neighbor1 [i] - > previous1.push_back(* v);' –

+0

謝謝大家的回覆。我明白了,你是對的菲利普斯先生。謝謝。 – user2419831

回答

-1

通常是因爲你有一些行動改變了矢量你救一個迭代器,例如後插入/擦除,之前保存的迭代器不再有效。

檢查您的代碼,看看是否是這種情況。

0

當您嘗試使用屬於同一類型的另一個向量的迭代器時,可能會發生這種情況。在某些時候,您可能正在創建一個向量的副本,但是您會使用新副本從原始向量中使用迭代器。

在這種情況下,罪魁禍首是由向量的副本傳回矢量副本到函數以及屬於原始的迭代器引起的。你將需要檢查你的代碼,看看vector和iteratos是如何傳遞的。任何複製的地方都是問題的潛在根源。

另外,正如Roy指出的那樣,如果您在執行某些容器的修改之後持有舊的迭代器,也會發生這種情況。對於任何時候添加或移除元素的情況,內部存儲可能需要調整大小,導致所有迭代器失效。任何使用這些迭代器的嘗試都會導致未定義的行爲,並可能發生任何事情

1

正如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 

正如你所看到的,它告訴我,採取臨時的地址是壞的。不僅如此,它實際上並沒有編譯,因爲這是一個錯誤。 cl可以明確地在那個上做得更好!

我的測試代碼,以防萬一:

#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; 
}