19

BOOST_FOREACHこの例のを「純粋な」C++11に相当するものに置き換えることは可能ですか?

#include <map>
#include <functional>
#include <boost/foreach.hpp>
#include <iostream>

int main() {
  std::map<int, std::string> map = {std::make_pair(1,"one"), std::make_pair(2,"two")};
  int k;
  std::string v;
  BOOST_FOREACH(std::tie(k, v), map) {
    std::cout << "k=" << k << " - " << v << std::endl;
  }
}

キーと値のペアをとへの参照に保持することが重要な機能kですv

私は試した:

for(std::tie(k,v) : map)
{
  std::cout << "k=" << k << " - " << v << std::endl;
}

auto i = std::tie(k,v);
for(i : map)
{
  std::cout << "k=" << k << " - " << v << std::endl;
}

しかし、範囲ベースのforループのアイデアはどれも機能していないようです。おそらく、範囲ベースのforループは、の前に宣言を持っている必要があります:

std::vector<int> test;
int i;
for (i : test);

無効です。

私が見つけることができる最も近い同等物は次のとおりです。

for (auto it = map.begin(); it!=map.end() && (std::tie(k,v)=*it,1); ++it)
{
  std::cout << "k=" << k << " - " << v << std::endl;
}

BOOST_FOREACHこれはバージョンほど簡潔ではありません!

C ++ 11でブーストせずに同じことを簡潔に表現する方法はありますか?

4

3 に答える 3

26
for (auto & i : map)
{
    std::tie(k,v) = i;
    // your code here
}
于 2012-05-09T20:42:12.470 に答える
3

これにより、Boost マクロと同じ出力が生成されます

for( auto const& k : map ) {
  std::cout << "k = " << k.first << " - " << k.second << std::endl;
}
于 2012-05-09T20:48:33.453 に答える