【问题标题】:What is the difference between vector.back() and vector.end()?vector.back() 和 vector.end() 有什么区别?
【发布时间】:2021-11-18 18:53:47
【问题描述】:

我是一个新的 C++ 学习者,我阅读了一个关于 C++ STL 访问向量中最后一个元素的代码块。

为什么第 6、7、8 行的代码需要减 1 才能等于第 5 行的代码?

1.    std::vector<int> v;
2.    v.push_back(999);
3.    //fill up the vector
4.    //...

5.    int j = v.back();
6.    int j = v.[size-1]
7.    int j = v.at(v.size()-1)
8.    int j = *(v.end()-1)

【问题讨论】:

  • @Ning Chang 成员函数 end 返回“指向”向量最后一个元素之后的迭代器。
  • 当您有这样的问题时,可以通过咨询reference来轻松回答

标签: c++ vector


【解决方案1】:

back() 只返回对最后一个元素的引用。而 end() 返回指向最后一个元素的指针或迭代器。此外,当使用 begin() 从头执行迭代时,end() 可用于检查停止条件。

【讨论】:

    【解决方案2】:

    这是哪个是哪个的插图

    v: [ 1 | 2 | 3 | 4 | ... | 999 ]
         ?                      ?     ?
       front()                back() end()
         ?
       begin()
    

    其中front()back() 分别返回对第一个和最后一个元素的(const)引用,而end() 返回一个迭代器(类似于指针)指向最后一个元素向量的元素。 begin() 返回指向向量第一个元素的迭代器。

    这些在std::vector也有解释

    front 访问第一个元素
    back 访问最后一个元素
    end/cend 将迭代器返回到末尾
    begin/cbegin 将迭代器返回到开头


    从 size 中减去 1 是因为 C 或 C++ 中的索引从 0 开始,而不是像通常那样从 1 开始。这意味着,为了访问数组的第一个元素,或者在这种情况下是向量,你说

    v[0]
    

    而不是

    v[1]
    

    同样对于最后一个(第 n 个)元素,您不会采用数组(向量)的 sizen,而是要少一个,例如

    v[size() - 1]
    

    v[n - 1]
    

    【讨论】:

      【解决方案3】:

      回答你的标题问题:

      函数调用 begin(), end() 将返回一个迭代器位置。 back() 只返回 Vector 中的最后一个元素。通常begin()和end()都是这样使用的。

      vector<int>::iterator i = someVector.begin();  //or someVector.end();
      while(i != someVector.end()){
          //do something;
          i++;
      }  //this will loop through all elements in the vector;
      

      正如其他人所提到的, .end() 在最后一个元素之后的 1 个位置。距离取决于数据结构实现和数据类型。在您的情况下,您甚至可以将迭代器视为指向 int 的指针。 (但它们不是!!!)所以如果你取消引用它,它会给你一个价值。事实上,`

      someVector.back();
      

      一样
      *(someVector.end()-1);
      

      要回答您的内容问题: 正如@FrankS101 所说,我们从 0 开始计数。

      【讨论】:

        【解决方案4】:
        5. int j = v.back();
        

        std::vector::back 被定义为返回向量中的最后一个元素。这是直截了当的。

        7. int j = v.[size-1]
        

        在 c++ 中索引为 0。如果一个顺序容器有 N 个元素,则有效索引介于 0 和 N-1 之间(含)。最后一个元素是 N-1,或size()-1

        8. int j = *(v.end()-1)
        

        std::vector::end 将迭代器返回到容器的末尾。之前的元素就是向量中的最后一个元素。

        【讨论】:

          【解决方案5】:

          std::vector::end() 是包含std::vector::back() 的迭代器之外的一个。

          【讨论】:

            【解决方案6】:

            vector.end() - 返回一个迭代器,该迭代器引用向量容器中的末尾元素。 vector.back() - 返回对向量中最后一个元素的引用。

            【讨论】:

              【解决方案7】:

              来自cplusplus

              back() 返回对向量中最后一个元素的引用。

              与成员vector::end不同,它返回一个刚刚过去的迭代器 元素,这个函数返回一个直接引用。

              在空容器上调用此函数会导致未定义的行为。

              【讨论】:

              • cplusplus 是一个糟糕的参考,它并不总是准确的。请首选en.cppreference.com
              • 但是有更好的例子。你到底发现了什么不准确的地方?
              • 是的,我没有完全使用“穷”这个词,即使我不得不这样做。
              • @MarekVitek 我在这里推荐你:What's wrong with cplusplus.com? cplusplus 和 cppreference 有不同的目标受众。 cplusplus.com 以准确性换取较低的准入门槛。适合快速阅读,但如果您真的需要了解详细信息,请查看其他地方。
              • @user4581301 只是在 cppreference.com 上看到 std::move 上的最后一次编辑让我觉得,他们没有什么不同。没有人需要在 SO 上写下它。如果我真的需要可靠的信息,那么我将转向标准本身。对于初学者来说 cplusplus.com 就好了。如果您发现错误,您可以修复它。
              猜你喜欢
              • 2010-10-02
              • 2011-12-12
              • 2010-09-16
              • 2012-03-14
              • 2012-02-06
              • 2011-02-25
              • 2011-11-22
              • 2015-03-26
              相关资源
              最近更新 更多