我的問題的一些詳細描述:
- 在 C 11 中創建向量或字串的迭代器。
- 做迭代器算術,迭代器減去 n
問題:c 11 會保持迭代器減去 n 大于 begin() 嗎?(如果n足夠大,編譯器會保證iter-n不超過迭代器的合法范圍嗎?)
uj5u.com熱心網友回復:
根據cppreference,iter - n實際上與:
vector<T>::iterator temp = iter;
while(n--) --temp;
return temp;
假設是來自命名iter的迭代器。如果大于,則在最后一個回圈的某個時刻,將相當于:vectorcontainerndistance(container.begin(), iter)while--temp
--container.begin();
根據cppreference,該行將是未定義的行為。
由于迭代器無法知道原始容器的任何資訊,因此它沒有辦法檢測它是否是 current container.begin(),因此如果不手動檢查范圍,它就無法確保它保持在合法范圍內。
uj5u.com熱心網友回復:
它不會,它只會執行算術運算并顯示迭代器的值,即使是負數。
使用 VSCode 執行代碼。
#include<conio.h>
#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector<int> v = {1,2,3,4,5,6};
vector<int> :: iterator it;
for(it=v.begin();it!=v.end();it )
{
cout<<*it-6<<endl;
}
return 0;
}
結果是:
-5
-4
-3
-2
-1
0
uj5u.com熱心網友回復:
它不會!我寫了以下代碼,然后VS2019報“degug assert failed”!
std::vector<int> v1 = { 1,2,3,4,5,6,7 };
std::vector<int> v_assign;
v_assign.assign(v1.begin() - 2, v1.begin() 3);
uj5u.com熱心網友回復:
不,迭代器算術不會對結果進行任何邊界檢查。您很容易得到一個無效的迭代器。
諸如給定的隨機訪問迭代器std::vector將允許您進行減法,因此您可以實施自己的邊界檢查。
it2 = it - min(n, it - container.begin());
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/410785.html
標籤:
上一篇:關于靜態初始化訂單慘敗的問題
