当迭代器指向 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,但没有任何东西可以改变递减开始迭代器的行为。
在已经指向集合第一个元素的迭代器上调用 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 suchb
thata == ++b
)
容器中第一个元素的迭代器不是这种情况,事实上 cppreference 显式调用了它:
The begin iterator is not decrementable and the behavior is undefined if
--container.begin()
is evaluated.
其他容器,如 std::vector
使用更广泛的概念,如 LegacyRandomAccessIterator,但没有任何东西可以改变递减开始迭代器的行为。