我有一个向量:
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;}
部分是一个“lambda”——基本上是一个函数对象的就地定义。它在 2011 年标准中被正式添加到 C++ 中,但在 2011 年之前已经足够了解,以至于自 2009 年左右以来的大多数编译器都实现了它们(例如,Visual Studio 2010 和至少回到 4.7 的 gcc 都这样做)。