альтернатива BOOST_FOREACH с помощью std :: set? - PullRequest
3 голосов
/ 24 октября 2011

Какая лучшая альтернатива BOOST_FOREACH, если вы хотите перебрать std :: set?

Когда я пытаюсь сделать то, что кажется разумным методом перебора набора, я получаю ошибки компиляции.Этот код:

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:: set :: iterator должен разрешить изменение значения, на которое он ссылается.

Я могу подумать о нескольких методах с любыми способами, но мне интересно, есть ли более чистый способ перебора множества.

1 Ответ

7 голосов
/ 24 октября 2011

У меня работает.Может быть, у вас есть параметры для 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 :: set :: iterator должен разрешать изменение значения, на которое ссылается.

Это не совсем то, что говорит эта ссылка.То, что вы не можете сделать, и что говорит эта ссылка, не сработает, это:

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

Поскольку вы не можете сформировать неконстантную ссылку из выражения const.(А именно каждый постоянный член std::set.)

...