繁体   English   中英

C ++标准对std :: vector的评价是什么 <int> V1,V2; 性病::距离(v1.begin(),v2.begin())?

[英]What does the C++ standard say about std::vector<int> v1,v2; std::distance(v1.begin(),v2.begin())?

我有这个代码

#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;
}

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

我在第815页的24.4.4迭代器操作中查看了N3376

 template<class InputIterator> typename iterator_traits<InputIterator>::difference_type distance(InputIterator first, InputIterator last); 

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

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

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

[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指定在违反前提条件时抛出异常。

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

unsigned int counts = 0;
while (iter1 != iter2)
{
  ++counts;
  ++iter1;
}

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

不满足requires ,这意味着代码具有未定义的行为:任何事情都可能发生。

在这种情况下将是未定义的行为。 因为last是不可达的距离first的(可能重复)递增first

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM