c ++ std :: vector检查第一个或最后一个元素

Men*_*des 21 c++ for-loop c++11

我有以下for eachC++代码:

for (auto item : myVector)
{
    std::cout << item;

    if (item == orderBy.IsLast())       // <--- Check if this is the last element
        std::cout << "(Is last element) " << std::endl;
    else if (item == orderBy.IsFirst()) // <-- Check if this is the first element
        std::cout << "(Is first element)" << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

当然,IfLast()IfFirst()不上不存在std::vector.是否有本地std::方法来检查第一个和最后一个元素?

vso*_*tco 20

for在这种情况下,您不应该使用基于范围的,因为这种for"隐藏"迭代器,并且您需要一个额外的计数器来跟踪向量中的位置.你可以干脆做

for(auto it = myVector.begin(); it != myVector.end(); ++it)
{
    if(it == myVector.begin()) // first element
    {
        // do something
    }
    else if(std::next(it) == myVector.end()) // last element
    {
        // do something else
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,my.Vector.back()只有在您确定向量中没有重复项时,只需与基于范围的元素进行比较即可.但是,如果例如最后一个元素的值在向量中出现多次,那么您将只找到它的第一个位置.所以这就是为什么在没有for附加索引的情况下使用基于范围的实际上没有好方法可以跟踪你在矢量中的确切位置.

编辑另请参阅@ thelink2012关于如何"欺骗"基于范围的答案,for以便您可以隐式获取元素的位置.


Den*_*rim 20

使用std::vector::frontstd::vector::back获取对第一个和最后一个位置的数据的引用.

Reference是一个关键字,因为您可以有效地检查迭代item的地址和相应的前/后引用的地址.在您的示例中,您使用itemby值而不是引用,因此这个prehaps不起作用,请考虑这个使用此方法的示例:

for(auto& item : myVector) // take item by reference
{
    std::cout << item;
    if (&item == &myVector.back())
       std::cout << "(last element) " << std::endl;
    else if (&item == &myVector.front())
       std::cout << "(first element)" << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

如果对象重载了运算符的地址& (虽然它被认为是一种不好的做法),你可能想要使用它std::addressof.

然而,这种方法对于std::vector<bool>专门化不起作用,因为它优化了向量以有效地存储位的向量,并且因为我们不能引用位,所以从这个数据结构中取出的所有引用都是一个不完全依赖于该地址的代理对象.内部数据.

  • 它将打破`std :: vector <bool>`:P(后者返回基于范围的代理,它们是rvalues,并且它不是真正的容器)但仍然,很好的答案. (4认同)

R S*_*ahu 5

使用std::vector::front()的第一个元素.
使用std::vector::back()最后一个元素.

在调用这些函数之前,请确保它vector不为空.

    if (!orderBy.empty() && item == orderBy.back()) <--- Check if this is the last element

    else if (!orderBy.empty() && item == orderBy.front()) <-- Check if this is the first element
Run Code Online (Sandbox Code Playgroud)