1. 程式人生 > >C++容器vector和迭代器iterator

C++容器vector和迭代器iterator

vector是同一種物件的集合,每個物件都有一個對應的整數索引值。和string物件一樣,標準庫將負責管理與儲存元素相關的類存。引入標頭檔案

#include<vector>

1.vector物件的定義和初始化

[cpp]
  1. vector<T> v1             vector儲存型別為T的物件。預設建構函式,v1為空  
  2. vector<T> v2(v1)         v2是v1的一個副本  
  3. vector<T> v3(n,i)        v3包含n個值為i的元素  
  4. vector<T> v4(n)          v4含有值初始化的元素的n個副本  


如果沒有指定元素的初始化式,標準庫將自行提供一個元素初始值進行初始化,初始值取決於儲存在vector中元素的資料型別。

例:

vector儲存內建型別如int,那麼標準庫將用0值建立元素初始化式

vector<int> res(10);      //10個元素,每個被初始化為0

vector儲存的是含有建構函式的類型別的元素,標準庫將用該型別的預設的建構函式建立元素的初始化式

vector<string> res(10)      //10個元素,每個被初始化為空字串

還有第三種情況,元素型別可能是沒有定義建構函式的類型別。這種情況下,標準庫仍產生一個帶初始值的物件,這個物件的每個成員進行了值初始化。

2.vector物件的操作

幾種重要的操作

  1. 新增或移除元素的方法
    1. vec.push_back() - 新增元素至 vector 的尾端,必要時會進行記憶體配置。
    2. vec.pop_back() - 刪除 vector 最尾端的元素。
    3. vec.insert() - 插入一個或多個元素至 vector 內的任意位置。
    4. vec.erase() - 刪除 vector 中一個或多個元素。
    5. vec.clear() - 清空所有元素。
  2. 取得長度/容量
    1. vec.size() - 取得 vector 目前持有的元素個數。
    2. vec.empty() - 如果 vector 內部為空,則傳回 true 值。
    3. vec.capacity() - 取得 vector 目前可容納的最大元素個數。這個方法與記憶體的配置有關,它通常只會增加,不會因為元素被刪減而隨之減少。
  3. 重新配置/重設長度
    1. vec.reserve() - 如有必要,可改變 vector 的容量大小(配置更多的記憶體)。在眾多的 STL 實做,容量只能增加,不可以減少。
    2. vec.resize() - 改變 vector 目前持有的元素個數。
  4. 迭代 (Iterator)
    1. vec.begin() - 回傳一個Iterator,它指向 vector 第一個元素。
    2. vec.end() - 回傳一個Iterator,它指向 vector 最尾端元素的下一個位置(請注意:它不是最末元素)。
    3. vec.rbegin() - 回傳一個反向Iterator,它指向 vector 最尾端元素的。
    4. vec.rend() - 回傳一個Iterator,它指向 vector 的第一個元素。

3.迭代器簡介

除了使用下標來訪問vector物件的元素外,標準庫還提供了訪問元素的方法:使用迭代器。迭代器是一種檢查容器內元素並且遍歷元素的資料型別。

1.容器的iterator型別

每種容器型別都定義了自己的迭代器型別,如vector:   vector<int> ::iterator iter;     變數名為iter。

2.begin和end操作

每種容器都定義了一隊命名為begin和end的函式,用於返回迭代器。

  • 如果容器中有元素的話,由begin返回的元素指向第一個元素。

        vector<int>::iterator iter=v.begin();

        若v不為空,iter指向v[0]。

  • 由end返回的迭代器指向最後一個元素的下一個,不存在,若v為空,begin和end返回的相同。

        *iter=0;

        iter++即將迭代器向前移動一個位置

        即將v[0]賦值為0,由end返回的不允許進行解操作。

  • ==和!=操作符來比較兩個迭代器,若兩個迭代器指向同一個元素,則它們相等,否則不想等。

使用舉例:

[cpp] 
  1. #include <iostream>
  2. #include<vector>
  3. usingnamespace std;  
  4. int main()  
  5. {  
  6.     vector<int> v;  
  7.     cout<<"在末尾插入元素 "<<endl;
  8.     for(int i=0;i<10;i++){  
  9.      v.push_back(i);  
  10.     } 
  11.     cout<<"刪除末尾元素 "<<endl; 
  12.     v.pop_back(); 
  13.     cout<<"使用front()、at()、back() "<<endl;  
  14.     cout<<v.front()<<"-"<<v.at(4)<<"-"<<v.back()<<endl;  
  15.     cout<<"判斷不為空、插入元素"<<endl;
  16.     for(int i=0;i<10;i++){
  17. if(!v.empty())
  18.             v.push_back(++i);  
  19.     }  
  20.     cout<<"列印vector陣列元素"<<endl;;  
  21.     for(size_t i=0;i<v.size();i++){  
  22.     cout<<"第"<<i<<"個元素"<<":"<<v[i]<<endl;  
  23. }
  24.     return 0 ;  
[cpp] 
  1. #include <iostream>
  2. #include<vector>
  3. #include <cstdlib>
  4. usingnamespace std;  
  5. int main()  
  6. {  
  7.     vector<int> v1;  
  8.     vector<int>::iterator it;  
  9.     for(int i=0;i<10;i++){  
  10.         v1.push_back(i);  
  11.     }  
  12.     cout<<"正向輸出:"<<endl;  
  13.     for(it=v1.begin();it!=v1.end();it++){  
  14.         cout<<*it<<" ";  
  15.     }  
  16.     cout<<endl;  
  17.     cout<<"反向輸出:"<<endl;  
  18.     vector<int>::reverse_iterator rit;  
  19.     for(rit=v1.rbegin();rit!=v1.rend();rit++){  
  20.             cout<<*rit<<" ";  
  21.     }  
  22.     int arr[]={0,1,2,3,4,5,6,7,8,9};  
  23.     vector<int> v2(arr,arr+10);         //將arr陣列複製到容器v2中去
  24.     vector<int>::iterator it2;  
  25.     for(it2=v2.begin();it2!=v2.end();it2++){  
  26.         cout<<*it2<<" ";  
  27.     }    
  28.     vector<int> v3(v2.begin(),v2.end());//利用建構函式初始化容器v3
  29.     vector<int>::iterator  it3;  
  30.     for(it3=v3.begin();it3!=v3.end();it3++){  
  31.         cout<<*it3<<"  ";  
  32.     }  
  33.     //erase和insert對於const iterater和const reverse_itetater並不支援
  34.     vector<int> v4(10,10);  
  35.     vector<int>::iterator  it4;  
  36.     for(it4=v4.begin();it4!=v4.end();it4++){  
  37.         cout<<*it4<<"  ";  
  38.     }  
  39.     //resize()的使用
  40.     cout<<endl<<"v1大小:"<<v1.size()<<endl<<"v2大小:"<<v2.size()  
  41.         <<endl<<"v3大小:"<<v3.size()<<endl<<"v4大小:"<<v4.size()  
  42.         <<endl;  
  43.     v3.resize(10,0);  
  44.     cout<<"resize()為10後v3的大小:"<<v3.size()<<endl;  
  45.     for(int i=0;i<(int)v3.size();i++){  
  46.        cout<<v3[i]<<" ";  
  47.     }    
  48.     v3.resize(5);  
  49.     cout<<endl<<"resize()為5後v3的大小:"<<v3.size()<<endl;  
  50.     for(int i=0;i<(int)v3.size();i++){  
  51.         cout<<v3[i]<<" ";  
  52.     }  
  53.     //擦除的使用
  54.     v1.clear();  
  55.     cout<<endl<<"v1全擦除後的大小:"<< v1.size()<<endl;  
  56.     cout<<"插入操作insert()";  
  57.     vector<int>::iterator itx;  
  58.     itx=v1.begin();  
  59.     cout<<endl<<"在位置1插入88"<<endl;;  
  60.     v1.insert(itx,88);//在開始的位置插入111,
  61.     for(int i=0;i<(int)v1.size();i++){  
  62.             cout<<v1[i]<<" ";  
  63.     }    
  64.     cout<<endl;  
  65.     v1.insert(itx,10,5);//從位置0開始連續插入10個5;
  66.     for(int i=0;i<(int)v1.size();i++){  
  67.         cout<<v1[i]<<" ";  
  68.     }    
  69.     cout<<endl<<"擦除位置5到位置10的元素"<<endl;  
  70.     v1.erase(itx+5,itx+10);    //擦除位置5到位置10的元素、
  71.     for(int i =0;i<(

    相關推薦

    C++容器vectoriterator

    vector是同一種物件的集合,每個物件都有一個對應的整數索引值。和string物件一樣,標準庫將負責管理與儲存元素相關的類存。引入標頭檔案#include<vector>1.vector物件的定義和初始化[cpp]vector<T> v1      

    容器vectoriterator的學習使用

    vector、algorithm、deque、functional、iterrator、list、map、memory、numeric、queue、set、stack、utility vector的宣告: vector<type> vec;size();r

    序列容器vector

    一、容器vector vector類模板提供了一種佔用連續記憶體地址的資料結構。這使得它可以高效,直接的利用下標運算子[]訪問vector中的任一元素,當一個vecto的記憶體空間耗盡時,它會分配一個更大的連續空間(陣列),把原先的資料複製(或移動)到新的空間(陣列),並把原來的空間(陣

    java-Collection集合、List集合、Vector集合Iterator、ListIterator的使用

    1、物件陣列的概述和使用  * A:案例演示     * 需求:我有5個學生,請把這個5個學生的資訊儲存到陣列中,並遍歷陣列,獲取得到每一個學生資訊。    *     Student[] arr = new Student[5]; //儲存學生物件     arr[0] = new Student("張三

    標準庫vector型別iterator型別

    對C++ Primer 中文版第4版  第三章標準庫型別中的vector型別和迭代器iterator型別做一個總結。 vector稱為容器,是同一種類型的物件的集合。一個容器中的所有物件都必須是同一種類型。 1.使用vector之前,必須包含相應的標頭檔案。宣告如下:  

    Python中的生成器(generator)(Iterator)

    Python是一種動態的程式語言,那就具有動態程式語言的特性,可以在執行時改變其結構,比如新的函式,物件、程式碼也可以引進,已有的函式可以被刪除。。。目前最常用的可以歸納為以下幾點:1.執行的過程中給物件繫結(新增)屬性,2.執行過程中給類繫結(新增)屬性,3.執行的過程中給類繫結(新增)方法,4.

    python 入門第三課 物件IterableIterator

    迭代物件Iterable和迭代器Iterator __author__ = 'admin' from collections.abc import Iterator from collections.abc import Iterable print(isinstance([],Iterable)) p

    Qt: 容器類、foreach關鍵字

    引言: 容器類和迭代器類提供 刪除、修改、插入和儲存資料的功能。 這兩種類可以將各種資料型別的資料以元素為單位進行儲存。 例如: 不使用Qt提供的容器類:如果要將QString型別的資料儲存到陣列,則

    C++標準模板庫 iterator 詳解(一)

    [cpp] view plaincopyprint? #include <vector> #include <iostream> #include <list> #include <

    C# 入門(14) 列舉(enumerator)iterator

    C#的列舉器和迭代器      列舉器一般用來foreach的,而迭代器在Unity中常用來當協程(Coroutine)用。 列舉器 IEnumerator介面   實現IEnumerator介面的類就可以foreach了,當然前提是實

    C/C++容器理解

    為什麼要有容器?    我知道有陣列,但陣列有一個弊端,它是固定的,不可變。這個經常會導致出現數組越界導常的錯誤。並且還需要事先知道這個陣列的長度才可以定義。 但很多時候,我們並不知道未來將會發生什麼,所以我們創造了容器,它是不固定的,可變的,可以根據元素的增加而增加,每次增加原陣列的1.5倍。為什麼是1.5

    C++ 中使用for迴圈遍歷容器

    之前一直看的是第四版的《C++ Primer》,裡面貌似只介紹了用迭代器遍歷容器(可能是受當時版本所限),這裡記錄下如何用for迴圈來遍歷容器(也可遍歷普通陣列) class Solution{ // C++ 中預設的成員函式型別是private,

    C++容器iterator遇到刪除函式erase時

          C++中添加了各種各樣的STL容器,不僅數量眾多,而且功能強大,如果能夠正常使用,可以使我們省去諸多時間。迭代器(iterator)是一種物件,它能夠用來遍歷標準模板庫容器中的部分或全部元素,每個迭代器物件代表容器中的確定的地址,簡單點就是每個“節點”物件的“指標

    vector物件的定義初始化以及vectoriterator

    向vector新增元素 push_back()操作接受一個元素值,並將它作為一個新的元素新增到vector物件的後面,也就是“插入(push)”到vector物件的“後面(back)”: vector迭代器 除了使用下標來訪問vector物件的元素外,標準庫還提供了另一種檢測元素的方法:使用迭代器(itera

    c++ 數組皇冠體育平臺出租指針(vector的低級復合類型)

    更改 平臺出租 amp 通過 follow code ref 下標 萬能 一、數組皇冠體育平臺出租 haozbbs.com Q1446595067 1.數組的缺點:數組的長度是固定的,無法改變大小;無法知道數組的大小;數組也不提供push_back等類型的操作,用下標進

    C++標準庫vector【轉】

    (轉自:https://blog.csdn.net/zhy_cheng/article/details/8041940?utm_source=blogxgwz46) vector是同一種物件的集合,每個物件都有一個對應的整數索引值。和string物件一樣,標準庫將負責管理與儲存元素相關的類存。

    PythonIterator生成器generator

    容器(container) 容器是一種把多個元素組織在一起的資料結構,容器中的元素可以逐個地迭代獲取,可以用in, not in關鍵字判斷元素是否包含在容器中。通常這類資料結構把所有的元素儲存在記憶體中(也有一些特例,並不是所有的元素都放在記憶體,比如迭代器和生成器物件) 可迭代物

    (Iterator) 生成器 (Generator) (八)

    迭代器與生成器這一章節還沒有看的恨透,只把這一章節的例子全看完了,也看懂了。但是自己寫不出這樣優秀的程式碼。這是我缺少的技能。 // 迭代器(Iterator) 和 生成器(Generator)                  // 迭代器是一種特殊物件         

    Iterator使用這個訪問方法,可以讓開發人員不需要了解訪問的容器的底層結構,就可以對容器遍歷 是輕量級的容器

    package com.java.Interview; import java.util.Iterator; import java.util.LinkedList; import java.util.List; public class TestIterato

    IteratorListIterator

    Iterator迭代器 屬於設計模式,提供了一個方法,對集合/容器內的元素進行遍歷,而不用關注底層實現細節,達到資料與上層遍歷解耦的目的.(解耦: 訪問邏輯從不同型別的集合類中抽取出來,接觸兩者間的聯合關係。) Iterator迭代器提供的三種方法:(迭代器直接操作