在C ++中迭代一个向量

时间:2012-12-01 16:26:36

标签: c++

我有一个矢量:

std::vector<std::pair<int, long> > v;
v.push_back(std::make_pair(1, 2L));
etc...

如何迭代它并从中获取int和long元素?

2 个答案:

答案 0 :(得分:5)

使用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;
}

答案 1 :(得分:0)

简短的回答是:“强烈偏好,使用算法”。真正的问题是你要对这些物品做些什么。要使用@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;}部分是“lambda” - 基本上是函数对象的就地定义。它在2011年的标准中被正式添加到C ++中,但是在2011年之前已经知道大多数编译器自2009年左右开始实现它们(例如,Visual Studio 2010和gcc至少恢复到4.7)。