boost::tieで、std::pairやboost::tupleの値を取得する

一般的に、std::pairの値を取得するにはfirstとsecondを使います。

#include <map>
#include <string>

std::pair<int, std::string> a(1, "Hello");
int i = a.first;
std::string s = a.second;

boost::tieを使うと、次のように取得することができます。

#include <map>
#include <string>
#include <boost/tuple/tuple.hpp>

std::pair<int, std::string> a(1, "Hello");
int i;
std::string s;
boost::tie(i, s) = a;

boost::tieは、boost::tupleの値を取得することもできます。

#include <map>
#include <string>
#include <boost/tuple/tuple.hpp>

boost::tuple<int, double, std::string> a(1, 2.34, "Hello");
int i;
double d;
std::string s;
boost::tie(i, d, s) = a;

std::mapのすべての要素を使用するとき、iteratorを使います。

#include <iostream>
#include <map>
#include <string>
#include <boost/assign.hpp>

std::map<int, std::string> m = boost::assign::map_list_of(1, "one")(2, "two")(3, "tree");
for (std::map<int, std::string>::iterator p = m.begin(); p != m.end(); ++p)
{
  std::cout << p->first << ", " << p->second << std::endl;
}

BOOST_FOREACHとboost::tieを使い、次のように書くこともできます。

#include <iostream>
#include <map>
#include <string>
#include <boost/assign.hpp>
#include <boost/foreach.hpp>
#include <boost/tuple/tuple.hpp>

std::map<int, std::string> m = boost::assign::map_list_of(1, "one")(2, "two")(3, "tree");
int i;
std::string s;
BOOST_FOREACH(boost::tie(i, s), m)
{
  std::cout << i << ", " << s << std::endl;
}

Boostの入門書なら『Boost C++ Librariesプログラミング』がお薦め。私も購入しました。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です