C++ 检查元素是std::vector中的第一个还是最后一个元素 我对每个

C++ 检查元素是std::vector中的第一个还是最后一个元素 我对每个,c++,c++11,for-loop,C++,C++11,For Loop,在这种情况下,你不应该使用基于范围的for,因为这种for“隐藏”迭代器,你需要一个额外的计数器来跟踪向量中的位置。你可以简单地这样做 for(auto it = myVector.begin(); it != myVector.end(); ++it) { if(it == myVector.begin()) // first element { // do something } else if(std::next(it) == myVecto

在这种情况下,你不应该使用基于范围的
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
    }
}
请注意,只需比较
my.Vector.back()
只有在确定向量中没有重复项的情况下,才可以使用基于范围的for中的元素。但是,如果最后一个元素的值在向量中出现多次,则只会找到它的第一个位置。因此,如果没有额外的跟踪向量中确切位置的索引

编辑另请参见@TheLink 2012的答案,了解如何为对基于范围的
进行“欺骗”,以便隐式获取元素的位置。

用于第一个元素。
用于最后一个元素

在调用这些函数之前,请确保
向量
不是空的

    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

如果(!orderBy.empty()&&item==orderBy.back())用于基于值的比较,可以使用
myVector.front()
/
myVector[0]
作为第一个元素,使用
myVector.back()
myVector[myVector.size()-1]
作为最后一个元素

建议
默认情况下捕获引用以避免不需要的副本


for(const auto&I:myVector)

您可以再次搜索它,但这将非常低效。如果您需要有关当前项位置的信息,可能需要使用迭代器或索引:

for (std::size_t i=0; i<myVector.size(); ++i)
{
    auto& item = myVector[i];
    std::cout << item;

    if (i == (myVector.size() - 1))
       std::cout << "(Is last element) " << std::endl;
    else if (i == 0)
       std::cout << "(Is first element)" << std::endl;
}
for(std::size\u t i=0;i使用and获取对第一个和最后一个位置的数据的引用

这里的引用是一个关键字,因为您可以有效地检查迭代
项的地址
以及相应的前/后引用的地址。在您的示例中,您按值而不是引用获取
,因此此预捕获不起作用,请考虑使用此方法的示例:

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;
}
for(auto&item:myVector)//通过引用获取项
{

std::cout如果边界有特殊情况,则应使用ol'迭代器版本,但将第一个和最后一个情况与循环分开

如果案例共享代码,那么您应该将其封装到函数中

我无法从手机上编写代码:c

这对我很有用

vector<int> vi {1,2,3,4};

cout << "vi = {";
for (const auto &e : vi) {
  cout << e;

  if (&e != &vi.back())
    cout << ',';
}
cout << '}' << endl;
向量vi{1,2,3,4};
CUT <代码>,1 < /代码>是冗余的,或者甚至<代码> It 1 +代码>很好。不能理解为什么我不应该使用它。这是一个坏的实践吗?实际上我不需要迭代器,但是<代码>项目< /代码>元素……你也可以考虑一个向量,它的第一个元素也是它的最后一个元素:门德兹,这不是一个坏的做法。取决于场景。如果你想跟踪向量中的位置,最好使用迭代器循环。如果你只想显示元素(而不是它们的位置),那么一个基于范围的是可以的。如果只对头部/尾部元素进行特殊操作,考虑把它带出循环。请选择<代码>。(auto&item:myVector)
for(const auto&item:myVector)
以防止复制和可变。另一个C++11之前的版本:如果向量的最后一个元素重复了怎么办?它不起作用,你必须跟踪索引。@vsoftco,我不知道OP对这些检查的意图是什么。考虑到发布的代码,它们(1)不要期望看到重复的,或者(2)希望多次看到输出。我差点说你错了。但是这里引用+1.std::vector将在
std::vector
:P上中断(后者返回基于for的范围内的代理,它们是右值,并且它不是真正的容器)不过,答案还是不错。@vsoftco很好的观点,可能很容易被忽略!我已经更新了答案。非常感谢大家的提醒:)@vsoftco:希望没有人使用这种反常现象。@MatthieuM。你是说
vector
还是答案?答案很好,在我看来,不会发生任何错误(当然,除非向量元素重载了
操作符&
)。甚至
向量
。之前有人在同一个问题中给出了类似的答案