簡體   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