如何在C++中找到向量中倒数第二个元素

How to find the second to last element in a vector in C++?

本文关键字:倒数 倒数第二 第二个 元素 向量 C++      更新时间:2023-10-16

我正在尝试构建一个使用向量中倒数第二个元素的程序,到目前为止我已经使用了:

(arr2.rbegin()+1)

如果我在条件中使用比较运算符,例如:

if(arr2.rbegin()+1 == true) 

我收到一条错误消息:no match for operator ==

许多答案和注释都有正确的想法,但语法非常难看。这里有两种很好的表达方式。

arr2.end()[-2] // end() is past the last element, -1 for last element, -2 for second-last
arr2.rbegin()[1] // rbegin() is reverse order starting at 0 for last element, 1 for second-last

演示:http://ideone.com/2cZeUq

它之所以有效,是因为vector所具有的RandomAccessIterator需要提供operator[],使得it[n]*(it + n)等效,就像指针一样。

所以你问题中的代码变成了

if (arr2.rbegin()[1]) // test penultimate element

查看此处的文档

http://www.cplusplus.com/reference/vector/vector/?kw=vector

我希望你能通过访问你的元素

secondToLast = myVector[myVector.size() - 2];

您可以尝试这样做:-

if(*(arr2.rbegin()+1))

有时列表中的项目可能少于2个,因此myVector.size()-2或其他直接访问器将抛出错误。我已经完成了以下操作。

if (myVector.size() > 1)
{
    secondToLast = myVector[myVector.size() - 2];
}

这取决于"倒数第二个元素"的含义。采用以下迭代器定义。。。

vector<int>::iterator it = arr2.end();
it--; 
it--;

您必须两次谴责迭代器,因为当您声明迭代器"指向"末尾时,它实际上引用了向量中最后一个元素之后的位置。

不要忘记,当你想要迭代器指向的值时,你必须取消引用它

cout << *it;

主要用于lulz,但如果您的元素是非标量的,并且您需要访问有问题的元素的成员,则可以使用++->构造:

std::vector<std::pair<int, int>> arr = ...;
auto grug = arr.rbegin()[1].first;
auto leet = arr.rbegin()++->first;
assert(grug == leet);

它的工作方式是用++rbegin()返回的迭代器进行后增量,然后用->访问它。实际上,它优于最清晰的[1]形式,因为它可以在任何迭代器上工作,而不仅仅是随机访问迭代器。

把它贴在评论上,然后拿一些爆米花。

有很多方法可以从后面访问元素您可以使用std::vector容器附带的back属性如果您想从后面访问一个元素(最后一个元素或最多n个)你可以做这个

std::vector vec{1,2,3};int lastsecond=vec.back()-1;会给你->2.

你可以检查向量的属性,其中有一个不错的比特。

https://en.cppreference.com/w/cpp/container/vector