最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解C++中的vector容器及用迭代器訪問vector的方法

 更新時間:2016年05月11日 16:08:25   作者:chenzhongpu  
使用迭代器iterator可以更方便地解引用和訪問成員,當(dāng)然也包括vector中的元素,本文就來詳解C++中的vector容器及用迭代器訪問vector的方法,需要的朋友可以參考下

vector

vector是相同類型對象的集合。集合中的每個對象有個對應(yīng)的索引。vector常被稱為容器(container)。
為了使用vector,需要:

#include <vector>
using std::vector;

vector是一個類模版(class template)。C++有函數(shù)模版和類模版。模版本身不是函數(shù)或類,必須通過指定 類型讓編譯器去實例化(instantiation)它。比如vector<int> ivec。
vector是模版,不是類型。從vector得到的類型要包含元素的類型。
早期C++定義vector的元素是vector是,最后一個閉括號前必須有一個空格,如vector<vector<int> >。但是C++ 11不要求這樣。
定義和初始化vectors

最常有的定義vectors的方法如下:

方法 解釋
vector v1 默認(rèn)初始化,v1是空的
vector v2(v1) v2有v1每個元素的拷貝
vector v2 = v1 等價于v2(v1)|
vector v3(n, val) v3有n個val
vector v4(n) v3有n個元素,每個元素是value-initialized
vector v5{a, b, c, ...} v5的元素即a, b, c, ...
vector v5 = {a, b, c, ...} 等價于v5{a, b, c, ...}

需要注意的是,最常用使用vector的方法就是定義一個起初為空的vector,即vector<T> v,在運(yùn)行時指定元素。
vector的列表初始化(list initializing)

上面使用花括號(curly brace)的方法是列表初始化,是C++ 11引入的。
比如,

vector<string> articles = {"an", "a", "the"};

我們看到C++有很多初始化的方式,很多情況下它們是可以互換的,但有些時候初始化的形式是不能換的:
當(dāng)使用拷貝初始化形式(即使用=),只能提供單個初始化器
當(dāng)提供in-class初始化,只能是拷貝初始化或者花括號
列表初始化只能使用花括號,不能是圓括號
有關(guān)value-initialized

前面提到vector<int> ivec(10)這種只指定元素個數(shù)的初始化方法,每個元素是value-initialized。即:
對內(nèi)置類型,值為0
對類類型,使用默認(rèn)初始化
花括號,圓括號

vector<int> v1(10); // 10個元素,都是0
vector<int> v1{10}; // 1個元素,是10
vector<int> v1{10, 1}; // 2個元素,分別是10, 1
vector<int> v1(10, 1); // 10個元素,都是1

需要注意的是,使用{}并不一定就是列表初始化;它表示: 如果可能的話,使用列表初始化。

vector<string> v5{"hi"}; // ok, list initialization
vector<string> v6("hi"); // error: cann't construct vector from string lieral
vector<string> v7{10}; // has ten default-initialized value.

上面的v7就使用花括號指定個數(shù),而不是列表初始化。
向vector添加元素

使用push_back方法。
重要概念:vector高效增長:
標(biāo)準(zhǔn)要求vector的實現(xiàn)能夠在運(yùn)行時高效添加。如果在定義vector時指定了大小,就顯得沒必要,甚至導(dǎo)致 差的性能??傊话阒苯娱_始定義一個空的vector。
另外,我們要確保即使循環(huán)改變了vector的大小,循環(huán)也是正確的。因此,不能在range for里面向vector添加元素。
其它的vector操作

最常用的操作有:

方法
v.empty()
v.size()
v.push_back(t)
v[n]
==, !=, <, <=, >, >=

類似的,v.size()返回的類型也是size_type的。需要注意的是,模版類的類型始終是包括元素類型的,

vector<int>::size_type // ok
vector::size_type // error

關(guān)于下標(biāo)訪問,它只能訪問已經(jīng)存在的元素,不會添加。

vector<int> ivec;
cout << ivec[0]; // error

for (decltype(ivev.size()) ix = 0; ix != 10; ix++)
  ivec[ix] = ix; // disaster: has no element

  
迭代器
盡管我們可以使用下標(biāo)來訪問字符串中的字符或vector的元素,但更一般的機(jī)制是使用迭代器(iterator)。
所有的容器都支持迭代器,但僅少數(shù)幾個支持下標(biāo)操作。
合法的迭代器:

  • 指示某個元素
  • 指示最后一個元素的下一個位置
  • 其它的迭代器都是不合法的。
  • 使用迭代器

使用begin和end成員函數(shù)。

// b 指示第一個元素;e 指示最后一個元素的下一個位置
auto b = v.begin(), e = v.end();

一般我們不必關(guān)心迭代器的準(zhǔn)確類型,所以直接使用auto。
end返回的迭代器一般被稱為off-the-end迭代器,或者縮寫為end迭代器。
顯然,如果一個容器為空,begin返回的和end返回的相同。
迭代器的操作

| 方法 | 解釋 | | iter | 返回指示元素的引用 | | iter->mem | 解引用iter,并獲取名字為mem的成員,等價于 (iter).mem | | ++iter | 增加iter,指示下一個 | | --iter | 減小iter,指示前一個 | | == , != | 比較 |
下面是把遇到空白字符前的字符轉(zhuǎn)成大寫。

for(auto it = s.begin(); it != s.end() && !isspace(*it); ++it)
  *it = toupper(*it);

熟悉C或者Java語言的人可能需要習(xí)慣C++里面for循環(huán)一般都是使用!=結(jié)束,而不是使用<。 這是因為,所有的容器的迭代器都定義了!=和==方法;而絕大部份迭代器沒有<方法。通過使用!=,我們可以不必 關(guān)心處理容器的準(zhǔn)確類型。
迭代器的類型

就像我們不知道vector或string的size_type的準(zhǔn)確類型,我們一般也不知道迭代器的準(zhǔn)確類型。
庫類型的迭代器定義了iterator和const_iterator兩種類型。

vector<int>::iterator it; // 可讀,可寫
vector<int>::iterator it2; // 可讀,可寫
vector<int>::const_iterator it3; // 可讀,不能寫

const_iterator的行為類似一個const指針。就像const指針,const_iterator不能修改所指示的元素。如果 一個vector或者字符串是const的,那么只能使用const_iterator。
如果對象是const的,那么begin和end返回的就是const_iterator;如果對象不是const的,返回的就是iterator。 但這種行為有時不是我們想要的,即針對非const對象,我們也希望得到const_iterator。C++ 11引入了兩個新的函數(shù), cbegin和cend解決了這一問題。

auto it3 = v.cbegin();

解引用和訪問成員

當(dāng)對迭代器解引用時,得到的是其指示的對象。如果該對象是個類類型的,我們可能要訪問其的成員。舉個例子,一個字符串的vector可能想知道 給定元素是否為空,可以使用(*it).empty()。
需要注意的是,(*it).empty()這個括號是必須的。否則,點操作符直接作用于it。因此,*it.empty()是錯誤的。
為了簡化這種表示,語言定義了箭頭操作符(->),它把解引用和成員訪問組合為一個符號,即it->empty()。
迭代器的算術(shù)

自增與自減是所有迭代器都支持的操作。
而對于string和vector的迭代器,還支持額外的算術(shù)操作。
| 方法 | | iter + n | | iter - n | | iter1 += n | | iter2 -= n | | iter1 - iter2 | | >, >=, <, <= |
比如,計算vector中間位置,

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

需要注意的是,迭代器的相加是不合法的。

相關(guān)文章

  • C語言修煉之路悟徹數(shù)組真妙理?巧用下標(biāo)破萬敵下篇

    C語言修煉之路悟徹數(shù)組真妙理?巧用下標(biāo)破萬敵下篇

    在C語言和C++等語言中,數(shù)組元素全為指針變量的數(shù)組稱為指針數(shù)組,指針數(shù)組中的元素都必須具有相同的存儲類型、指向相同數(shù)據(jù)類型的指針變量。指針數(shù)組比較適合用來指向若干個字符串,使字符串處理更加方便、靈活
    2022-02-02
  • c++超細(xì)致講解引用

    c++超細(xì)致講解引用

    引用(reference)就是C++對C語言的重要擴(kuò)充。引用就是某一變量(目標(biāo))的一個別名,對引用的操作與對變量直接操作完全一樣
    2022-05-05
  • 基于C++實現(xiàn)BMI身體質(zhì)量指數(shù)計算工具

    基于C++實現(xiàn)BMI身體質(zhì)量指數(shù)計算工具

    BMI(Body?Mass?Index,身體質(zhì)量指數(shù)),也稱為體重指數(shù),是一種常用的衡量成人人體肥胖程度的指標(biāo),本文就來用C++編寫一個簡單的BMI計算工具吧
    2023-10-10
  • C語言修煉之路初識分支句?循環(huán)助本心下篇

    C語言修煉之路初識分支句?循環(huán)助本心下篇

    現(xiàn)實生活中我們經(jīng)常需要根據(jù)不同的條件做出不同的選擇。程序設(shè)計中也需要根據(jù)條件來選擇不同的程序進(jìn)行處理,這稱之為分支結(jié)構(gòu),當(dāng)條件表達(dá)式不存在時,它被假設(shè)為真。您也可以設(shè)置一個初始值和增量表達(dá)式,一般情況下,C?程序員偏向于使用?for(;;)?結(jié)構(gòu)來表示一個無限循環(huán)
    2022-03-03
  • 單鏈表實現(xiàn)反轉(zhuǎn)的3種方法示例代碼

    單鏈表實現(xiàn)反轉(zhuǎn)的3種方法示例代碼

    單鏈表的反轉(zhuǎn)是常見的面試題目,下面這篇文章主要給大家介紹了關(guān)于單鏈表實現(xiàn)反轉(zhuǎn)的3種方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-02-02
  • WIN32程序獲取父進(jìn)程ID的方法

    WIN32程序獲取父進(jìn)程ID的方法

    這篇文章主要介紹了WIN32程序獲取父進(jìn)程ID的方法,在進(jìn)行windows程序開發(fā)的時候有一定的實用價值,需要的朋友可以參考下
    2014-08-08
  • C語言關(guān)于自定義數(shù)據(jù)類型之枚舉和聯(lián)合體詳解

    C語言關(guān)于自定義數(shù)據(jù)類型之枚舉和聯(lián)合體詳解

    枚舉顧名思義就是把所有的可能性列舉出來,像一個星期分為七天我們就可以使用枚舉,聯(lián)合體是由關(guān)鍵字union和標(biāo)簽定義的,和枚舉是一樣的定義方式,不一樣的是,一個聯(lián)合體只有一塊內(nèi)存空間,什么意思呢,就相當(dāng)于只開辟最大的變量的內(nèi)存,其他的變量都在那個變量占據(jù)空間
    2021-11-11
  • C語言實現(xiàn)字符串匹配KMP算法

    C語言實現(xiàn)字符串匹配KMP算法

    相信很多人(包括自己)初識KMP算法的時候始終是丈二和尚摸不著頭腦,要么完全不知所云,要么看不懂書上的解釋,要么自己覺得好像心里了解KMP算法的意思,卻說不出個究竟,所謂知其然不知其所以然是也。
    2014-08-08
  • C語言實現(xiàn)井字棋游戲(人機(jī)對弈)

    C語言實現(xiàn)井字棋游戲(人機(jī)對弈)

    這篇文章主要為大家詳細(xì)介紹了C語言實現(xiàn)井字棋人機(jī)對弈游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • C語言實現(xiàn)自動給QQ好友發(fā)窗口抖動

    C語言實現(xiàn)自動給QQ好友發(fā)窗口抖動

    這篇文章主要介紹了C語言實現(xiàn)自動給QQ好友發(fā)窗口抖動,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-11-11

最新評論

保山市| 西盟| 滕州市| 塔河县| 壤塘县| 革吉县| 特克斯县| 策勒县| 富平县| 安岳县| 高清| 同心县| 惠东县| 达拉特旗| 武川县| 壤塘县| 塔河县| 白水县| 利川市| 乌兰县| 常宁市| 昌黎县| 新田县| 石屏县| 藁城市| 肇庆市| 阳春市| 安顺市| 资阳市| 松滋市| 高密市| 丹江口市| 托克逊县| 昭苏县| 麻阳| 碌曲县| 仲巴县| 凌源市| 吴忠市| 商南县| 宣武区|