簡體   English   中英

為什么這兩段代碼會給我不同的結果?

[英]Why do these two segments of code give me different results?

我有一個對象G ,它是一個圖形。 我重載了括號運算符,以便G[i]返回一個list<int> (STL列表),這是一個頂點i的鄰接列表。

我有這兩段代碼,它們都應該迭代G[i] ,但只有第一段有效。

list<int> adj = G[2];

for(list<int>::iterator it = adj.begin(); it != adj.end(); it++) {
    cout << *it << " ";
}

這不起作用......

for(list<int>::iterator it = G[2].begin(); it != G[2].end(); it++) {
    cout << *it << " ";
}

據我所見,他們做同樣的事情。 任何人都可以解釋為什么第二個代碼段不起作用? 另外,有沒有更好的方法迭代我的列表?

我重載了括號運算符,以便G[i]返回一個list<int>

確保operator []的返回類型是list<int>& ,而不是list<int> 否則,每次調用G[2]時都會在返回時創建副本,因此永遠不會到達G[2].end()

如果你調用[]一次,就像你在第一個具有adj代碼片段中所做的那樣,問題將不可見(盡管列表將被復制兩次 - 一次return ,一次在賦值運算符中)。 第二個片段通過多次調用[]運算符來暴露問題。

也許Graph::opertor[]每次都返回一個新list ,因此您無法比較不同列表之間的迭代器。

list<int> adj = G[2];
list<int>::iterator end = adj.end();

for(list<int>::iterator it = adj.begin(); it != end; ++it) {
  cout << *it << " ";
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM