C++标准对std :: vector <int> v1,v2有什么看法; 性病::距离(v1.begin(),v2.begin())?

Ale*_*son 27 c++ standards iterator c++-standard-library language-lawyer

我有这个代码

#include <vector>
#include <iostream>

int main(int argc, char* argv[])
{
   std::vector<int> v1,v2;
   std::cout << std::distance(v1.begin(),v2.begin());
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

它有一个bug,因为比较两个不同向量的迭代器没有意义.

我看了一下N337624.4.4迭代器操作在815页:

template<class InputIterator>
typename iterator_traits<InputIterator>::difference_type
distance(InputIterator first, InputIterator last);
Run Code Online (Sandbox Code Playgroud)

要求:如果InputIterator符合随机访问迭代器的要求,last应可以从firstfirst到达last; 否则,last应该可以从 first.

现在我认为需求没有实现.

在这种情况下,标准状态应该发生什么?

Col*_*mbo 28

[iterator.requirements.general]:

迭代器j被称为到达从一个迭代i,当且仅当存在的表达的应用程序的有限序列++i ,使i == j.

问题是,一旦增加了v1.begin() v1.size()-1时间,下一个增量操作就会引发未定义的行为,因此v2.begin()无法从中获取v1.begin().同样的论点使得v1.begin()无法达成v2.begin().


如果您的问题是"如果违反了" 要求"部分中的条件会发生什么情况?",请查看[res.on.required]:

违反函数的Requires: 段中指定的前提条件会导致未定义的行为,除非函数的Throws: paragraph指定在违反前提条件时抛出异常.


Tho*_*ews 5

在一些实现中std::distance,第一迭代器递增直到它到达第二迭代器.计算迭代次数:

unsigned int counts = 0;
while (iter1 != iter2)
{
  ++counts;
  ++iter1;
}
Run Code Online (Sandbox Code Playgroud)

如果迭代器指向不同地址空间中的容器,那么循环很多都不会终止.使用标准中的术语,无法访问第二个迭代器.