当迭代器指向 std::begin() 时调用 operator-- 是否有效

Is it valid to call operator-- for an iterator when it points to std::begin()

在已经指向集合第一个元素的迭代器上调用 operator-- 是否有效?不同集合的答案是否会改变(例如,列表与矢量与集合)。例如。见下文

#include <algorithm>
#include <iostream>
#include <numeric>
#include <string>
#include <vector>
 
int main()
{
    std::vector<int> v {1, 2, 4, 8, 16};

    auto i=v.begin();
    auto j=i;
    --i;  // not sure what's the effect of this
    v.erase(j);
    ++i;  // also not sure if this is not std::begin() anymore, what's the effect of ++
    v.erase(i);

 
    // Print vector.
    std::for_each(v.begin(), v.end(), [](const int n) { std::cout << n << ' '; });
}

我怀疑这是未定义的行为,但不太确定。

此外,如何从 std::list 中删除元素,如下所示

    std::list<int> v = { 1, 2, 3, 4, 5, 6 };
 
    for (auto it = v.begin(); it != v.end(); it++)
    {
        v.erase(it--);
    }

我们以 std::list 为例,因为基本上相同的推理将适用于其他容器。

正在查看 member types of std::list, we see that std::list::iterator is a LegacyBidirectionalIterator。检查那里的描述,我们看到为 operator-- 列出的以下先决条件是有效的:

Preconditions:

  • a is decrementable (there exists such b that a == ++b)

容器中第一个元素的迭代器不是这种情况,事实上 cppreference 显式调用了它:

The begin iterator is not decrementable and the behavior is undefined if --container.begin() is evaluated.

其他容器,如 std::vector 使用更广泛的概念,如 LegacyRandomAccessIterator,但没有任何东西可以改变递减开始迭代器的行为。