亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

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

2020-05-23 14:04:39
字體:
來源:轉載
供稿:網友
使用迭代器iterator可以更方便地解引用和訪問成員,當然也包括vector中的元素,本文就來詳解C++中的vector容器及用迭代器訪問vector的方法,需要的朋友可以參考下
 

vector

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

#include <vector>using std::vector;

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

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

方法 解釋
vector v1 默認初始化,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,在運行時指定元素。
vector的列表初始化(list initializing)

 

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

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

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

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

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

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

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

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

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

最常用的操作有:

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

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

 

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

關于下標訪問,它只能訪問已經存在的元素,不會添加。

vector<int> ivec;cout << ivec[0]; // errorfor (decltype(ivev.size()) ix = 0; ix != 10; ix++)  ivec[ix] = ix; // disaster: has no element

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

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

使用begin和end成員函數。

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

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

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

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

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

就像我們不知道vector或string的size_type的準確類型,我們一般也不知道迭代器的準確類型。
庫類型的迭代器定義了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引入了兩個新的函數, cbegin和cend解決了這一問題。

auto it3 = v.cbegin();

解引用和訪問成員

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

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

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

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



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
好吊成人免视频| 欧美日韩亚洲高清| 亚洲欧美在线一区二区| 欧美风情在线观看| 欧美成人亚洲成人| 国产福利成人在线| 国产日本欧美一区二区三区| 国产日产欧美a一级在线| 超碰日本道色综合久久综合| 亚洲视频在线观看| 亚洲国产日韩欧美在线动漫| 欧美激情视频网站| 丝袜亚洲欧美日韩综合| 亚洲va久久久噜噜噜久久天堂| 55夜色66夜色国产精品视频| 黑人极品videos精品欧美裸| 日韩av电影国产| 日韩欧美aⅴ综合网站发布| 亚洲一区二区三区四区视频| 欧美极品少妇xxxxⅹ免费视频| 欧美另类极品videosbestfree| 久久青草精品视频免费观看| 亚洲美女视频网| 亚洲精品国产欧美| 国产999精品| 国内免费精品永久在线视频| 热门国产精品亚洲第一区在线| 97超碰蝌蚪网人人做人人爽| 97超级碰碰人国产在线观看| 精品国产精品自拍| 亚洲乱码av中文一区二区| 精品国模在线视频| 国产丝袜一区二区| 亚洲精品国产精品自产a区红杏吧| 欧美在线不卡区| 亚洲a一级视频| 欧美在线一区二区三区四| 亚洲精品福利免费在线观看| 黑人极品videos精品欧美裸| 久久视频在线视频| 欧美大片免费观看| 欧美日韩国产色视频| 久久五月天综合| 日韩在线播放av| 精品国产鲁一鲁一区二区张丽| 国产一区二区丝袜高跟鞋图片| 久久久精品999| 亚洲美女中文字幕| 91亚洲va在线va天堂va国| 国产第一区电影| 欧美精品videosex性欧美| 亚洲丝袜av一区| 成人久久一区二区| 黑人与娇小精品av专区| 亚洲午夜未满十八勿入免费观看全集| 中文字幕久热精品视频在线| 亚洲国产成人精品电影| 欧美乱大交做爰xxxⅹ性3| 久久人人爽亚洲精品天堂| 久久久亚洲影院| 成人黄色短视频在线观看| 日韩欧美在线视频免费观看| 色yeye香蕉凹凸一区二区av| 在线观看国产精品日韩av| 国产日韩在线精品av| 久久精品视频播放| 国产在线日韩在线| 日韩美女免费线视频| 97成人精品区在线播放| 亚洲第一精品福利| 91精品国产综合久久香蕉922| 国产精品视频网址| 中文字幕久热精品视频在线| 国产偷亚洲偷欧美偷精品| 精品露脸国产偷人在视频| 久久免费视频在线观看| 欧美成人网在线| 久久久久北条麻妃免费看| 日韩中文在线中文网在线观看| 一本色道久久综合狠狠躁篇的优点| 久久久久久这里只有精品| 亚洲乱码一区av黑人高潮| 亚洲国产日韩欧美在线动漫| 日韩禁在线播放| 亚洲精品国产精品乱码不99按摩| 久久久久久国产精品三级玉女聊斋| 精品一区二区亚洲| 国内精久久久久久久久久人| 日本久久精品视频| 欧美日韩免费区域视频在线观看| 91视频国产一区| 91国产在线精品| 欧美成aaa人片在线观看蜜臀| 国产在线日韩在线| 亚洲人成自拍网站| 色多多国产成人永久免费网站| 国产成人在线一区| 欧美激情一区二区三级高清视频| 亚洲成人激情视频| 色婷婷综合久久久久中文字幕1| 中文字幕国产精品久久| 日韩成人在线播放| 亚洲欧美成人在线| 欧美激情综合色综合啪啪五月| 91wwwcom在线观看| 久久精品久久久久久| 成人黄色av播放免费| 国产日本欧美一区| 亚洲国产精品电影在线观看| 日本高清视频一区| 日本久久久a级免费| 亚洲精品一区中文字幕乱码| 欧美小视频在线| 亚洲成人精品av| 亚洲黄色www| 91免费人成网站在线观看18| 97成人超碰免| 亚洲成人动漫在线播放| 91网站在线看| 日韩毛片在线看| 久久好看免费视频| 日韩在线视频国产| 欧美色欧美亚洲高清在线视频| 精品福利在线看| 北条麻妃在线一区二区| 国产主播欧美精品| 欧美多人爱爱视频网站| 亚洲二区在线播放视频| 欧美日韩一区二区三区| 亚洲老司机av| 91高清视频在线免费观看| 最新69国产成人精品视频免费| 日本欧美黄网站| 国产精品av在线播放| 久久成人人人人精品欧| 日韩电影网在线| 91精品国产综合久久香蕉922| 国产美女精彩久久| 国产男人精品视频| 国产精品福利久久久| 92版电视剧仙鹤神针在线观看| 久久99青青精品免费观看| 亚洲sss综合天堂久久| 青草成人免费视频| 伊人久久久久久久久久久久久| 成人免费淫片aa视频免费| 91精品久久久久久久久青青| 午夜欧美不卡精品aaaaa| 欧美激情久久久久| 亚洲男女自偷自拍图片另类| 亚洲free性xxxx护士hd| 国产aaa精品| 精品国偷自产在线视频| 亚洲欧洲日产国码av系列天堂| 国内精品久久久久| 亚洲欧美制服另类日韩| 日韩av中文字幕在线| 成人在线中文字幕| 国产精品一区二区三区久久久| 亚洲最新av网址| 欧美性一区二区三区| 日韩欧美国产黄色| 色老头一区二区三区在线观看| 久久精品在线播放|