c++之迭代器


一、迭代器簡介

    迭代器是一種遍歷容器內元素的數據類型,類似於指針。迭代器是用來指向容器內的某一個元素。

    如:string、vector都可以用[]進行訪問,但更常用的訪問方式是使用迭代器進行訪問。

    通過迭代器可以讀取、修改指向的容器內的元素。

    常用的容器還有list、map,c++都有對應的迭代器。

二、容器的迭代器類型

vector<int> iv = {100,200,300};
vector<int>::iterator iter; // 定義迭代器

 

三、迭代器相關操作

//begin() end()操作一般返回迭代器類型,反向迭代器rbegin()/rend();
vector<int> iv={100,200,300};
vector<int>::iterator iter; // 定義迭代器
iter = iv.begin();   //如果容器有元素,返回的迭代器指向第一個元素
iter = iv.end();      //指向末端元素的后邊,為無效數據

//如果一個容器為空,則begin()和end()返回的迭代器相同,起到標記的作用。

vector<int> iv={100,200,300};
// 使用正向迭代器
for(vector<int>::iterator iter = iv.begin(); iter != iv.end(); iter++)
{
  cout << *iter << endl; //100 200 300
}
// 使用反向迭代器
for(vector<int>::reverse_iterator riter = iv.rbegin(); riter != iv.rend(); riter++)
{
  cout << *riter << endl; //300 200 100
}

四、迭代器運算符

vector<int> iv = {100,200,300};
vector<int>::iterator iter = iv.end();
cout << *iter << endl; //錯誤操作,不能輸出
vector<int>::iterator iter1 = iv.begin();
iter1++; //++指向后一個元素
cout << *iter1 << endl; //200
 
         
iter1--; //--指向前一個元素
 
         
cout << *iter1 << endl; //100

// == != 兩個迭代器是否指向同一個元素

//如何引用結構體的成員,與結構體指針類似

// (*ptriter).num ptriter->num

  

五、const_iterator 迭代器

      const_iterator 迭代器 表示不能通過該迭代器來修改指向元素的值,但迭代器可以指向不同的元素,只能通過該迭代器讀元素。

vector<int> iv={100,200,300};
for(vector<int>::const_iterator iter = iv.begin(); iter != iv.end(); iter++)
{
  cout << *iter << endl; //100 200 300
}

const vector<int> iv={100,200,300}; //必須使用常量迭代器
for(vector<int>::const_iterator iter = iv.begin(); iter != iv.end(); iter++)
{
  cout << *iter << endl; //100 200 300
}

  

  cbebgin()和cend()操作

vector<int> iv={100,200,300};
for(vector<int>::const_iterator iter = iv.cbegin(); iter != iv.cend(); iter++)
{

*iter = 4;//報錯
  cout << *iter << endl; //100 200 300
}

六、迭代器失效

vector<int> iv = {1,2,3,4,5};
for(auto vecitem : iv)
{
  iv.push_back(888); //將導致迭代器失效

  cout << *vecitem << endl;
}
//在操作迭代器的過程中,不要改變容器的容量。(不要執行增加或刪除的操作)

//往容器中增加或刪除元素,可能導致指向容器元素的指針、引用、迭代器失效。
//失效就表示不能再表示任何容器中的元素,一旦使用失效的迭代器,等同於使用了野指針。

//如果需要執行刪除/新增等,需要立即break出循環

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM