c++ vector數組的使用


介紹:

首先我們要明白以下幾點:

1.vector數組是一個能存放任意數據類型(類,結構,普通變量類型等)的動態數組!,在數據結構中就相當於順序儲存的線性表,尋找元素非常快,但是插入元素的時間卻很大(list是一個雙向鏈表,在同一個為止插入大量的數據時速度很快,但是查找的速度就會慢很多)

2.和普通數組一樣可以通過下標索引來進行訪問

3.與其它動態序列容器相比(deques, lists and forward_lists), vector在訪問元素的時候更加高效,在末尾添加和刪除元素相對高效。對於其它不在末尾的刪除和插入操作,效率更低。比起lists和forward_lists統一的迭代器和引用更好。

4.vector動態數組可以通過數組名進行直接賦值!  vector<yang> c;   vector<yang> b;    b = c; 

5.他的缺點:當新元素插入時候,這個數組需要被重新分配大小為了增加存儲空間。其做法是,分配一個新的數組,然后將全部元素移到這個數組。就時間而言,這是一個相對代價高的任務,因為每當一個新的元素加入到容器的時候,vector並不會每次都重新分配大小。(比普通的數組具有更高的時間復雜度和空間復雜度

vector的常規操作:

vector的定義:

#include<vector>//頭文件一定要有

using namespace std;//其所在的命名空間

vector<int> vec;        //聲明一個int型向量

vector<int> vec1(4,1);                            //vec1的內容為1,1,1,1 
vector<int> vec1{ 1, 2, 3, 4, 5, 6 };             //vec1內容1,2,3,4,5,6

vector<int> vec(tmp);   //聲明並用tmp向量初始化vec向量(也可以用vec=t,p)

int arr[5] = {1, 2, 3, 4, 5};   
vector<int> vec(arr, arr + 5);      //將arr數組的元素用於初始化vec向量
//說明:當然不包括arr[4]元素,末尾指針都是指結束元素的下一個元素,
//這個主要是為了和vec.end()指針統一。
vector<int> vec(&arr[1], &arr[4]); //將arr[1]~arr[4]范圍內的元素作為vec的初始值

  

 數組插入元素:

1.vec.push_back(同類型量);作用是在vector的末尾插入新元素;

2.insert()第一個參數為迭代器,作用為在迭代器前面插入新元素;

3.assign(5,1)向vector中加入5個1,同時清除掉以前的元素。

 std::vector<int> vec1;  
  vec1.push_back(1);  
  vec1.push_back(2);  
//vec1元素:1,2
  std::vector<int> vec2(vec1);  //將vec1賦值給vec2
  std::vector<int>::iterator it;  
  it=vec2.begain();  
  vec2.insert(it,5);  //在第一個元素前添加5
  it=vec2.begain();  //每當新插入一個元素時內存重新分配所以要重新為迭代器分配指針
  vec2.insert(it,2,6); 
  std::vector<int> vec3(vec2);  
  vec3.assign(2,5);  //清楚所有元素只留兩個5

刪除元素: 

1.pop_back()刪除最后一個元素。

2.erase()刪除指定位置元素。(其中的參數要是指針變量,比如begain(),end(),以及迭代器值),例如vec.erase(vec.begin()+2);刪除第3個元素

3.clear()清除所有元素。

4.empty()判斷該數組是否為空

遍歷數組:

1.front()訪問第一個元素(第一個元素的值而不是地址!begin()相反)

2.back()訪問最后一個元素(最后一個元素的值而不是地址!end()相反)

3.size()數組的元素個數

vector<int> a;
//像數組一樣以下標訪問 
for(int i = 0; i < a.size(); i++)
{
    cout << a[i];
}
 
//以迭代器訪問
vector<int>::iterator it;
for(it=a.begin(); it!=a.end(); it++)
{
    cout<<*it<<" " ;
}

 

翻轉和排序的遍歷:

#include <algorithm>
reverse(vec.begin(), vec.end())//將元素翻轉,即逆序排列!

#include <algorithm>
sort(vec.begin(), vec.end()); //采用的是從小到大的排序
//如果想從大到小排序,可以采用上面反轉函數,也可以采用下面方法:
bool Comp(const int& a, const int& b) {
    return a > b;
}
sort(vec.begin(), vec.end(), Comp);

用vector數組創建二維數組:

//C++ 構建二維動態數組
int **p;
p = new int*[10];    //注意,int*[10]表示一個有10個元素的指針數組
for (int i = 0; i < 10; ++i)
{
    p[i] = new int[5];
}

//用vector構建二維數組
vector<vector<int>> matrix;
vector<int>a;
a.push_back(1);
a.push_back(3);
a.push_back(1);
matrix.push_back(a);
//或者用下面的方法
int i,j;
vector<vector<int>> array(5);
for (i = 0; i < array.size(); i++)
    array[i].resize(3);//這里一定要使用resize其相當於每行的元素數並已經初始化過了

 

 

使用注意事項:

迭代器中刪除元素的操作時:

刪除元素:

std::vector< int> Vec;
std::vector< int>::iterator itVec;
for( itVec = Vec.begin(); itVec != Vec.end(); )
{
      if( WillDelete( *itVec) )
      {
          itVec = Vec.erase( itVec);
       }
      else
          itList++;
}

  

     對vector、queue等,每次erase操作,函數會刪除指定迭代器位置的元素,然后將后面的元素前移一位,erase返回指向被刪除元素下一元素的迭代器。(其實,我認為,返回的還是指定的迭代器,只不過它現在指向了被刪除元素的下一元素,如有不對,懇請大家指正!)

     對於erase操作,還有一種寫法是:Vec.erase(itVec++)

    不過需要注意,這種寫法對vector、deque等容器無效!

上面兩種寫法,第一種對各種容器都有效,第二種寫法只對map,list等容器有效。為了方便統一,還是建議采取第一種寫法。

增加元素:

出於學習的目的,現在提出一個要求,如原有vector為{1,2,3,4,5},現在要在每個元素前加一個8,使vector變為{8,1,8,2,8,3,8,4,8,5}.用循環表示,代碼如下:

#include<iostream>
#include <vector>
using namespace std;

int main()
{
    vector<int> vec{ 1,2,3,4,5};
    auto iter = vec.begin();
    for (; iter != vec.end();)
    {
        iter = vec.insert(iter,8);
        iter++;
        iter++;
    }
    for (auto num : vec)
        cout << num << endl;
    return 0;
}

需要注意的是,insert會將指定對象插入指定迭代器之前的位置,並返回這個位置的迭代器,要想該迭代器指向之前的下一個元素,需要遞增兩次。

如果需要在每個元素之后插入元素,該怎么操作?

#include<iostream>
#include <vector>
using namespace std;

int main()
{
    vector<int> vec{ 1,2,3,4,5};
    auto iter = vec.begin();
    iter++;
    for (; iter != vec.end();)
    {
        iter = vec.insert(iter,8);
        iter++;
        iter++;
    }
    vec.insert(vec.end(),8);
    for (auto num : vec)
        cout << num << endl;
    return 0;
}

  

這里需要對iter首先自增一次,在循環最后,由於iter自加兩次,已經和end()函數返回迭代器位置一致,所以需要再insert一次,才能在尾部再插入一個元素。

關於迭代器失效有一篇總結:https://www.cnblogs.com/blueoverflow/p/4923523.html

 


免責聲明!

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



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