Check if the element is the first or the last one in an std::vector
You shouldn't use the range-based for
in this case, as this kind of for
"hides" the iterator, and you'd need an additional counter to keep track of the position in vector. You can simply do
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
}
}
Note that simply comparing my.Vector.back()
with your element from a range-based for is OK only if you're sure that you don't have duplicates in the vector. But if e.g. the value of the last element appears multiple times in the vector, you're going to find only its first position. So that's why there's really no good way of using a range-based for
without an additional index that keeps track of where exactly in the vector you are.
EDIT See also @thelink2012's answer for how to "trick" your range-based for
so you can get the position of the element implicitly.
Use the std::vector::front
and std::vector::back
to get a reference to the data in the first and last positions.
Reference is a keyword here because you could efficiently check the address of your iterating item
and the address of the respective front/back references. In your example you take the item
by value not reference so this prehaps wouldn't work, take in consideration this example that'd work with this method:
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;
}
If the object overloads the address of operator &
(though it's considered a bad practice) you might want to use std::addressof
instead.
This method won't work however for the std::vector<bool>
specialization since it optimizes the vector to store booleans efficiently with bits, and since we cannot have references to bits, all references taken out this data structure is a proxy object not exactly tied to the address of the internal data.
Use std::vector::front()
for the first element.
Use std::vector::back()
for the last element.
Before you call those functions, make sure that the vector
is not empty.
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