c++ 为什么std::vector< int>::iterator不是连续迭代器?

li9yvcax  于 2023-10-21  发布在  其他
关注(0)|答案(1)|浏览(100)

根据标准,引用的herevector<T>::iterator应该是连续的(对于T而不是bool),但在所有3个主要实现中都不是,为什么?

#include <iterator>
#include <vector>

using InputIterator = std::vector<int>::iterator;
static_assert(std::is_same_v<typename std::iterator_traits<InputIterator>::iterator_category, std::random_access_iterator_tag>);
static_assert(std::is_same_v<typename std::iterator_traits<InputIterator>::iterator_category, std::contiguous_iterator_tag>);

第一个static_assert成功了,但是第二个失败了,使用了最新的MSVC、GCC和clang。
https://godbolt.org/z/oG1x1xdda

slmsl1lt

slmsl1lt1#

std::vector<int>::iterator * 是 * 一个连续迭代器,因为它满足std::contiguous_iterator概念和 * 连续迭代器 * 要求。
std::iterator_traits不测试是否满足 contiguous iterator 要求,因为这些是语义要求。即使是指针也没有contiguous_iterator_tag作为它们的iterator_category,如[iterator.traits] p5中所指定的。任何类型拥有此标记的唯一方法是通过专门化std::iterator_traits
您应该使用相关概念来测试std::vector<int>::iterator是否是随机访问迭代器,甚至是连续迭代器:

#include <iterator>
#include <vector>

static_assert(std::random_access_iterator<std::vector<int>::iterator>); // OK
static_assert(std::contiguous_iterator<std::vector<int>::iterator>);    // OK

请注意,此测试可能会出现假阳性。如[iterator.concept.contiguous] p2中所述,std::contiguous_iterator有额外的语义约束,即使迭代器没有对连续迭代器进行建模,这个概念也可能被满足。
还要注意的是,std::iterator_traits也可能有一个iterator_concept别名成员,但仅用于指针,或者如果用户为它们的类型专门指定了std::iterator_traits。它不一定存在,您应该直接使用这些概念。

相关问题