2017-05-07 89 views
0

我有一個list<Thing*> clothes。我想打印出來things到所需的格式:循環中列表的最後一個元素

+- shirt 
+- pants 
\\ shoes 

所以基本上輸出爲所有,但最後一次迭代相同。到目前爲止,我已經嘗試這樣的:

string CCloset::OutputContent() const { 
    string output; 
    for(auto i : this->clothes) { 
     if(next(i) == this->clothes.end()) { 
      output.append("\\"); 
     } else { 
      output.append("+-"); 
     } 

     output.append(i->Output()); 
    } 
    return output; 
} 

的理論是,如果下一次迭代的原因迭代器i是在list.end()這意味着我們在最後一個元素,所以我們稍微修改輸出。編譯器說Can't compare structures

next()返回指向下一個元素的迭代器。在最後一個元素的情況下,它會指向列表的結尾。 list.end()返回迭代器指向列表的結尾。

我錯過了什麼?

+2

「我」不是一個迭代器,而只是「事*」。 –

+0

似乎'std :: vector '會更合適。它也可能會更快。 –

+0

@Torbjörn謝謝你,所以我將不得不使用經典的'for(begin,end,incr)' –

回答

2

正如評論者已經指出的那樣,i不是一個迭代器,但該元素的值。

如果修改了循環使用的參考,而不是一個值,你可以用最後一個元素的這樣的地址當前元素的地址比較:

for(const auto& i : this->clothes) { 
    if(&i == &this->clothes.back()) { 
     output.append("\\"); 
    } else { 
     output.append("+-"); 
    } 

    output.append(i->Output()); 
} 

Live demo on Coliru

1

i不是迭代器。 std::next只能用ForwardIterator或InputIterator調用,不能用容器的元素調用。

這是唯一的用例基於迭代循環之一:

for(auto it = clothes.begin(); it != clothes.end(); ++it) { 
    if(it + 1 == clothes.end()) { 
     output.append("\\"); 
    } else { 
     output.append("+-"); 
    } 

    output.append((*it)->Output()); 
} 
+0

如果冗餘不是第一個條件嗎? 「it!= clothes.end()」已經被for循環中的條件所覆蓋。 – Piotr99

+0

@ Piotr99是的,你說得對。 :) 感謝您指出了這一點。 – Rakete1111

相關問題