私はベクトルを持っています:
std::vector<std::pair<int, long> > v;
v.push_back(std::make_pair(1, 2L));
etc...
それを繰り返し処理して、int 要素と long 要素を取り出すにはどうすればよいですか?
私はベクトルを持っています:
std::vector<std::pair<int, long> > v;
v.push_back(std::make_pair(1, 2L));
etc...
それを繰り返し処理して、int 要素と long 要素を取り出すにはどうすればよいですか?
C++03 を使用:
for (std::vector<std::pair<int, long> >::iterator i = v.begin(); i != v.end(); ++i)
{
std::cout << "int: " << i->first << " long: " << i->second << std::endl;
}
C++11 の使用:
for (std::pair<int, long> p : v) // could also do auto p, auto& p, or (const) std::pair<int, long>& p
{
std::cout << "int: " << p.first << " long: " << p.second << std::endl;
}
簡単に言えば、「アルゴリズムを使用して、強い好みで」です。本当の問題は、アイテムをどうするかです。@cornstalks の例を使用するには、それらを印刷したい場合は、次のようにすることができます。
typedef std::pair<int, long> v_t;
std::vector<v_t> v;
std::ostream &operator<<(std::ostream &os, v_t const &p) {
return os << p.first << "\t" << p.second;
}
std::copy(v.begin(), v.end(), std::ostream_iterator<v_t>(std::cout, "\n"));
他のことを試してみましょう。項目を一緒に追加したい場合があります。つまり、pair<int, long>
各項目が配列の対応する項目の合計である を取得します。
std::accumulate(v.begin(), v.end(), std::make_pair(0,0L),
[](v_t const &a, v_t const &b) {
return std::make_pair(a.first+b.first, a.second+b.second);
});
この場合、(合理的に) 最近の C++ コンパイラを想定していることに注意してください。この[](params){statement;}
部分は「ラムダ」です。基本的には、関数オブジェクトのインプレース定義です。これは 2011 年の標準で公式に C++ に追加されましたが、2009 年頃からほとんどのコンパイラが実装するほど 2011 年より前に十分知られていました (たとえば、Visual Studio 2010 と gcc は少なくとも 4.7 に戻ります)。