为什么std::distance不适用于const和nonconst迭代器的混合
Why std::distance doesnt work on mix of const and nonconst iterators?
正如问题所说,我想知道原因。因为当我试图获取const
和非const
迭代器之间的距离时,我遇到了一个错误。
vector<int> v;
auto it=v.begin();
auto cit=v.cbegin();
distance(it,cit);
no matching function for call to ‘distance(__gnu_cxx::__normal_iterator<int*, std::vector<int> >&, __gnu_cxx::__normal_iterator<const int*, std::vector<int> >&)
从我对迭代器的有限理解来看,我看不出它为什么不工作。
在对std::distance
的调用中有一个可变迭代器和一个常量迭代器,因此模板参数推导失败。可以通过显式指定模板参数来解决此问题。
std::vector<int> v;
auto i1 = v.begin();
auto i2 = v.cbegin();
auto dist = std::distance<std::vector<int>::const_iterator>( i1, i2 );
这是因为std::distance()只接受一个模板参数:
template <class InputIterator>
iterator_traits<InputIterator>::difference_type
distance(InputIterator first, InputIterator last);
因此,first
和last
必须可转换为同一类型,不幸的是,模板解析不会考虑vector<int>::iterator
可转换为vector<int>::const_iterator
。
正如大家所说,这是因为std::distance
只采用一种迭代器类型,而模板参数推导无法选择它应该是哪一种(即使只有一种可能,因为iterator
转换为const_iterator
,但不能转换回来)。
可能值得写一个类似这样的模板:
template <typename Container>
typename Container::const_iterator constify(const Container &, typename Container::iterator it) {
return it;
}
然后你可以像这样强制模板推导:
std::distance(constify(v, it), cit);
而不是写出那种很长的字体。Container&
参数是一个遗憾,因为AFAIKContainer
不能单独从迭代器参数中推导出来。
std::distance
将与这两个迭代器一起工作,但不起作用的是模板参数推断。编译器正试图解决用什么类型来代替第一个模板参数,并且有两个潜在的候选者,根据标准,这两个候选者最终都会失败。
您可以做两件事中的一件,要么只比较相同类型的迭代器,要么将类型提供给模板:
std::distance<std::vector<int>::const_iterator>( v.begin(), v.cbegin() );
相关文章:
- 使用std::multimap迭代器创建std::list
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- C++中带有List类的迭代器Segfault
- 如何在c++迭代器类型中包装std::chrono
- 集合上的输出迭代器:assign和increment迭代器
- Boost Spirit,获取迭代器内部语义动作
- 对于set上的循环-获取next元素迭代器
- 为什么output_editor Concept不需要output_e迭代器标记
- c++17文件系统::recursive_directory迭代器()在mac上没有给出这样的目录,但在windows上
- 使用迭代器时如何访问对象在向量中的位置?
- std::vector::迭代器是否可以合法地作为指针
- 跟随整数索引列表的自定义类迭代器
- 不明白迭代器,引用和指针失效,一个例子
- 我可以使用反向迭代器作为ForwardIt吗
- ESP8266单片机矢量迭代器的C++问题
- 如何在C++中将迭代器作为函数参数传递
- 是否应避免从非常量迭代器转换为常量迭代器?
- 如何在 c++ 中将字符串迭代器变量传递给函数?
- 为什么 vector 的随机访问迭代器给出与指针不同的内存地址?
- 为什么std::distance不适用于const和nonconst迭代器的混合