【问题标题】:Iterate a vector in C++在 C++ 中迭代一个向量
【发布时间】:2012-11-19 14:55:21
【问题描述】:

我有一个向量:

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

如何遍历它并从中取出 int 和 long 元素?

【问题讨论】:

标签: c++


【解决方案1】:

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

【讨论】:

  • 老实说,在 C++11 中,我可能会使用 auto 并节省一些打字时间。
  • @chris:是的。我只是想向 bean 展示这些类型是什么。但是,是的,使用auto 会让事情变得更简洁。我添加了评论
  • 不起作用... 'i!= ((News*)this)->News::v.std::vector<_ty _ax> 中的 'operator!=' 不匹配::end [with _Ty = std::pair, _Ax = std::allocator<:pair qstring> >, std::vector<_ty _ax>::iterator = std: :_Vector_iterator<:pair qstring>, std::allocator<:pair qstring> > >, 类型名 std::_Vector_val<_ty _ax>::_Alty = std::allocator >]()'
  • @Cornstalks:第二个创建每对的副本,您应该使用参考。 auto p 仍然会复制,auto &amp;p 不会。
  • @beans:Works for me。但我看到您使用的是QString 而不是long。我不知道你的代码还有什么不同。
【解决方案2】:

简短的回答是:“通过强烈的偏好,使用算法”。真正的问题是您将如何处理这些项目。要使用@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&lt;int, long&gt;,其中每个项目都是数组中相应项目的总和:

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 都这样做)。

【讨论】:

    猜你喜欢
    • 2015-08-14
    • 2017-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-01
    • 2013-01-02
    • 1970-01-01
    • 2013-12-16
    相关资源
    最近更新 更多