91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++迭代器怎么用

發布時間:2021-08-30 11:04:55 來源:億速云 閱讀:276 作者:小新 欄目:編程語言

這篇文章主要介紹了C++迭代器怎么用,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

一、迭代器的特點

  • 迭代器是一種智能指針,具有遍歷復雜數據結構的能力

  • 不同的容器有不一樣的內部結構,因此會有一樣的迭代器類型

  • 迭代器定義后,并不屬于某一實例容器對象,只要是屬于該迭代器類型的容器類型都可用

迭代器的分類

C++的STL定義了5種迭代器

  • 輸入迭代器:提供了對其指向元素的只讀操作以及前++和后++操作符

  • 輸出迭代器:提供了對其指向元素的寫操作和++操作符

  • 向前迭代器:具有++操作符

  • 雙向迭代器:既具有++操作符也具有--操作符

  • 隨機訪問迭代器:是一般的迭代器,既可以隨機的實現跳躍跳動,也可以通過指針算術運算來實現跳躍移動

二、迭代器的使用

1.原理:迭代器定義之后,可指向指定類型容器內的元素,從而達到訪問容器內元素的能力

2.用法

  • 關鍵字interator代表聲明一個迭代器,前面需要指明類型

  • 迭代器指向容器的某一位置

  • 通過*解引用獲取元素的引用(注:*得到的是元素的引用)。也可用->得到該元素的成員(下面代碼會介紹)

string s= "HelloWorld";
string::iterator i; //一個string類型的迭代器
for (i = s.begin(); i != s.end(); i++)
{
  cout << *i;
}

3.解引用和成員訪問

注意:訪問成員時,要對迭代器加上(),否則產生的意義不同

(*item).empty(); //正確用法
*item.empty; //錯誤用法

 上面代碼中:第一行是解引用迭代器。而第二種是試圖訪問item中的empty成員,但是item是個迭代器,顯示是錯誤的

三、interator、const_iterator 

1.迭代器的核心關鍵字

屬于容器的內部成員,通過作用域限定符::訪問

2.分類

  • interator:當我們需要對容器元素進行修改、刪除等操作時或者對象是非常量時使用

  • const_iterator:當我們只是遍歷容器元素,而不更改容器元素時或者對象是常量時使用

注意:上面所說的常量是指常量容器,而不是容器內的元素為常量

3.兩者的選擇

建議:如果我們只是簡單的遍歷容器元素或者對象是常量時,一般使用const_iterator比較合適

4.C++11標準:cbegin()、cend()

C++11引進了兩個新函數,分別為cbegin()、cend(),其兩者的功能類似于begin()、end()

C++11標準之前,iterator與const_iterator都使用begin()、end()兩個輔助函數遍歷容器。

C++11標準之后,const_iterator既可以使用可以使用begin()、end(),也可以使用cbegin()、cend()。但是iterator還是只能使用begin()、end()

vector<int> v;
const vector<int> v2;
auto it1=v.begin(); //v1是vector<int>::iterator類型
auto it2=v2.cbegin();//v2是vector<int>::const_iterator類型

四、reverse_interator、const_reverse_interator

1.概念

標準模板庫容器的逆序迭代器

功能與interator、const_iterator均相同,但是用法不一樣

2.兩者區別

  • reverse_interator:與interator相同,改變容器內部元素時使用。只能使用rbegin()、rend()

  • const_reverse_interator:與const_iterator相同,只是單純遍歷容器內部元素時使用。能使用rbegin()、rend()、crbegin()、crend()

3.用法

用法的原理與interator、const_iterator是相同的

但是rbegin()、rend()分別指向容器元素的最后一個位置與第一個元素的前一個位置

//for循環打印的是3、2、1
 
vector<int> v;
vector<int>::const_reverse_iterator iter;
v.push_back(1);
v.push_back(2);
v.push_back(3);
for (iter = v.rbegin(); iter != v.rend(); iter++)
    printf("%d\t", *iter);

五、begin()、end()、cbegin()、cend()

4者都是容器的成員函數

cbegin()與cend()與begin()和end()原理相同,下面只介紹begin()與end()

1.概念:begin()、end()代表容器的特殊位置,分別為元素的第一個位置與最后一個元素的下一個位置

下面比如是vector的一個模型,則begin()、end()分別代表一下位置

C++迭代器怎么用

2.為什么要這樣設計?

  • begin():我們在遍歷容器的元素的時候,一般要獲取該元素的首元素,因此設計bengin()

  • end():當我們用迭代器遍歷容器的時候,一般需要結束條件(如遍歷到最后一個元素),但是遍歷到最后一個元素時又不能舍棄它,因此將最后一個元素的下一位置作為結束標志

六、rbegin()、rend()、crbegin()、crend()

這四者的原理與begin()、end()、cbegin()、cend()是相同的,也都是容器的成員函數

但是rbegin()、rend()分別代表最后一個元素與第一個元素的前一個位置

C++迭代器怎么用

七、迭代器的運算

說明:迭代器的運算符一般都是對迭代器所指元素的位置進行比較,返回的是比較結果或者改變迭代器的位置

迭代器沒有+運算

例如有迭代器iter,iter1,iter2

*iter 返回迭代器所指元素的引用
iter->data 代表當前所指位置處元素的的指針,可以訪問其函數或成員,等價于(*iter).data
++iter 令迭代器指向容器的下一個元素
--iter 令迭代器指向容器的前一個元素
iter1==iter2 判斷兩個迭代器的位置是否相同
iter1!=iter2 同上
>、>=、<、<= 同上

iter + n 改變迭代器的位置
iter - n 同上
iter +=n 同上
iter -=n 同上
iter1 - iter2 兩個迭代器相減,返回它們之間的距離

實例:遍歷vector中的元素,如果遇到空白,停止遍歷 

vector<string> v = {"Hello","fwe",""};
vector<string>::iterator iter;
for (iter = v.begin(); iter != v.end() && !iter->empty(); ++iter)
{
  cout << *iter<<"\t";
}

八、一些代碼事例

將string中的第一個字符改為大寫

string s = "helloWorld";
string::iterator it;
if (s.begin() != s.end())//先判斷s不為空
{
  it = s.begin();
  *it = toupper(*it);
}

使用容器元素的函數

(*item).empty(); //判斷是否為空
(*item).size(); //得到大小

得到中間元素的迭代器

auto mid=v.begin()+vi.size()/2;

折半查找string中的一個元素

string s = "abcdefghj";
char foundChar = 'e';
string::const_iterator l_iter=s.begin();
string::const_iterator r_iter=s.end();
string::const_iterator mid_iter = s.begin() + (r_iter - l_iter) / 2;
while (mid_iter != r_iter && *mid_iter != foundChar)
{
  if (*mid_iter > foundChar)
  {
    r_iter = mid_iter;
  }
  else
  {
    l_iter = mid_iter + 1;
  }
  mid_iter = l_iter + (r_iter - l_iter) / 2;
}
cout << *mid_iter << endl;

感謝你能夠認真閱讀完這篇文章,希望小編分享的“C++迭代器怎么用”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

c++
AI

雷州市| 平舆县| 金华市| 浠水县| 武鸣县| 万山特区| 丰原市| 齐齐哈尔市| 顺平县| 田阳县| 山丹县| 桐柏县| 聊城市| 阳原县| 龙胜| 桑日县| 玉田县| 石门县| 淮南市| 屏东市| 白银市| 桃江县| 芷江| 临漳县| 钟祥市| 内丘县| 龙州县| 静乐县| 吕梁市| 鸡泽县| 白水县| 隆子县| 榆社县| 西乌| 游戏| 通州区| 包头市| 三江| 皮山县| 昭苏县| 曲麻莱县|