2011-10-24 10 views
3

std :: setを反復処理するときにBOOST_FOREACHに最適な代替手段は何ですか?std :: setでBOOST_FOREACHの代わりに?

私が試して、セットを反復するための合理的な方法であると思われるものをコンパイルエラーにします。このコード:

set<string> nameSet; 
string aName; 
BOOST_FOREACH(nameSet, aName) { 
    cout << aName << endl; 
} 

はGCC 4.4.3でこのコンパイルエラーを生成します。

error: no match for ‘operator=’ in ‘nameSet = boost::foreach_detail_::deref [with T = std::basic_string<char, std::char_traits<char>, std::allocator<char> >, C = mpl_::bool_<false>](((const boost::foreach_detail_::auto_any_base&)((const boost::foreach_detail_::auto_any_base*)_foreach_cur70)), 0u)’ 

のstd ::セット::イテレータは、値の変異を可能にしなければならないので、this linkによると2は互換性がありませんそれは参照してください。

私はいくつかのハムフィストメソッドを考えることができますが、より洗練された方法でセットを反復するかどうか疑問に思っています。

+1

不完全なプログラムの断片を除いて、妥当な質問に対して+1を与えていたでしょうか。あなたの質問には、完全で最小限のプログラムを投稿してください。そうでなければ、コードを書く必要があります。 http://sscce.org/を参照してください。 –

答えて

7

私のために働きます。 BOOST_FOREACHのパラメータを逆にしているかもしれません。

#include <set> 
#include <string> 
#include <iostream> 
#include <boost/foreach.hpp> 

int main(int ac, char **av) { 

    std::set<std::string> nameSet(av+1, av+ac); 

    BOOST_FOREACH(const std::string& aName, nameSet) { 
    std::cout << aName << "\n"; 
    } 

    BOOST_FOREACH(std::string aName, nameSet) { 
    std::cout << aName << "\n"; 
    } 

    std::string aName; 
    BOOST_FOREACH(aName, nameSet) { 
    std::cout << aName << "\n"; 
    } 
} 


のstd ::設定::イテレータは、それが指す値の突然変異を可能にしなければならないので、this linkによれば、両者は互換性がありません。

これは実際にそのリンクが言っていることではありません。あなたはconstの式から非const参照を形成することはできませんので

BOOST_FOREACH(std::string& aName, nameSet) { 
} 

:あなたを行うことができず、何そのリンクが機能しません言うこと、これです。 (つまり、各constメンバーはstd::setです)

+0

doh!本当にありがとう。 –

関連する問題