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,因为比较两个不同向量的迭代器没有意义.
我看了一下N3376在24.4.4迭代器操作在815页:
Run Code Online (Sandbox Code Playgroud)template<class InputIterator> typename iterator_traits<InputIterator>::difference_type distance(InputIterator first, InputIterator last);
要求:如果
InputIterator
符合随机访问迭代器的要求,last
应可以从first
或first
到达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指定在违反前提条件时抛出异常.
在一些实现中std::distance
,第一迭代器递增直到它到达第二迭代器.计算迭代次数:
unsigned int counts = 0;
while (iter1 != iter2)
{
++counts;
++iter1;
}
Run Code Online (Sandbox Code Playgroud)
如果迭代器指向不同地址空间中的容器,那么循环很多都不会终止.使用标准中的术语,无法访问第二个迭代器.
归档时间: |
|
查看次数: |
1054 次 |
最近记录: |