2017-05-07 13 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; 
} 

理論は、次の反復の原因はlist.end()であることをiイテレータならば、それは我々が少し出力を変更するので、私たちは最後の要素にいる意味です。コンパイラはCan't compare structuresと言っています。

next()は、次の要素を指すイテレータを返します。最後の要素の場合、それはリストの終わりを指し示すでしょう。 list.end()は、リストの終わりを指すイテレータを返します。

私には何が欠けていますか?

+2

'i'はイテレータではなく、' Thing * 'だけです。 –

+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

ifの最初の条件は重複していませんか? "it!= clothes.end()"はすでにforループの条件でカバーされています。 – Piotr99

+0

@ Piotr99はい、そうです。 :)それを指摘してくれてありがとう。 – Rakete1111

関連する問題