[英]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.