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

时间:2015-04-15 15:42:40

标签: c++ iterator standards language-lawyer c++-standard-library

我有这段代码

#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应该可以到达   {{1}}。

现在我认为需要未得到满足。

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

4 个答案:

答案 0 :(得分: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]:

  

违反函数中指定的先决条件需要:   除非函数的抛出:,否则段落会导致未定义的行为   段落指定在前置条件为时抛出异常   侵犯。

答案 1 :(得分:5)

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

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

如果迭代器指向不同地址空间中的容器,则循环很多都不会终止。使用标准中的术语,第二个迭代器不能可达

答案 2 :(得分:3)

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

答案 3 :(得分:3)

在这种情况下将是未定义的行为。因为last无法通过(可能反复)递增firstfirst到达。