【问题标题】:C++ Access an element of pair inside vectorC ++访问向量内的对元素
【发布时间】:2012-10-08 16:01:39
【问题描述】:

我有一个向量,每个元素都是一对。我对语法感到困惑。有人可以告诉我如何遍历每个向量,然后依次遍历 pair 的每个元素来访问该类。

    std::vector<std::pair<MyClass *, MyClass *>> VectorOfPairs;

另外,请注意,我将在函数之间传递值,因此在我的代码的某些地方,VectorOfPairs 是由 *VectorOfPairs 指针传递的。

感谢您的帮助。谢谢

【问题讨论】:

    标签: c++ vector containers


    【解决方案1】:

    这应该可以工作(假设你有一个兼容 C++11 的编译器)

    for ( auto it = VectorOfPairs.begin(); it != VectorOfPairs.end(); it++ )
    {
       // To get hold of the class pointers:
       auto pClass1 = it->first;
       auto pClass2 = it->second;
    }
    

    如果您没有auto,则必须改用std::vector&lt;std::pair&lt;MyClass *, MyClass *&gt;&gt;::iterator

    【讨论】:

    • 个人不是auto的粉丝。没有downvote,很好的答案。
    • @JohnDibling 这对迭代器非常有用,对于某些类型的模板模式也是必需的。
    • 我理解auto 被添加到语言中的原因。当你必须的时候我可以使用它。我只是认为在不需要的时候使用auto 有点懒惰,并且可能有助于一代不知道自己在做什么的程序员。不过,我怀疑我自己的观点很独立。
    • @JohnDibling 我认为如果它不是强类型的,那将是一个有效的问题。但是,你必须知道它到底是什么才能将它传递给一个函数(例如),所以我认为所需的知识不会少。它只是整理了原本丑陋/冗长的声明。
    【解决方案2】:

    这是一个示例。请注意,我使用 typedef 来为那个又长又丑的类型名取别名:

    typedef std::vector<std::pair<MyClass*, MyClass*> > MyClassPairs;
    
    for( MyClassPairs::iterator it = VectorOfPairs.begin(); it != VectorOfPairs.end(); ++it )
    {
      MyClass* p_a = it->first;
      MyClass* p_b = it->second;
    }
    

    【讨论】:

      【解决方案3】:

      如果你有一个兼容 C++11 的编译器,另一个选择是使用基于范围的 for 循环

      for( auto const& v : VectorOfPairs ) {
        // v is a reference to a vector element
        v.first->foo();
        v.second->bar();
      }
      

      【讨论】:

      • +1:我希望我的 C++11“兼容”主要供应商编译器支持基于范围的 for 循环。 :(
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-14
      • 2021-12-28
      • 1970-01-01
      • 2013-09-06
      • 1970-01-01
      • 2018-12-16
      • 1970-01-01
      相关资源
      最近更新 更多