c vector開闢空間

2021-09-22 01:44:07 字數 3856 閱讀 6509

#includeusing namespace std;

int main()

; //vec1內容1,2,3,4,5,6

vector vec(tmp); //宣告並用tmp向量初始化vec向量(也可以用vec=t,p)

int arr[5] = ;

vector vec(arr, arr + 5); //將arr陣列的元素用於初始化vec向量

//說明:當然不包括arr[4]元素,末尾指標都是指結束元素的下乙個元素,

//這個主要是為了和vec.end()指標統一。

vector vec(&arr[1], &arr[4]); //將arr[1]~arr[4]範圍內的元素作為vec的初始值

陣列插入元素:

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

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

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

3456

78910

1112

std::vector vec1;

vec1.push_back(1);

vec1.push_back(2);

//vec1元素:1,2

std::vector vec2(vec1); //將vec1賦值給vec2

std::vector::iterator it;

it=vec2.begain();

vec2.insert(it,5); //在第乙個元素前新增5

it=vec2.begain(); //每當新插入乙個元素時記憶體重新分配所以要重新為迭代器分配指標

vec2.insert(it,2,6);

std::vector 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()陣列的元素個數12

3456

78910

1112

13vector a;

//像陣列一樣以下標訪問

for(int i = 0; i < a.size(); i++)

//以迭代器訪問

vector::iterator it;

for(it=a.begin(); it!=a.end(); it++)

翻轉和排序的遍歷:12

3456

78910

#include

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

#include

sort(vec.begin(), vec.end()); //採用的是從小到大的排序

//如果想從大到小排序,可以採用上面反轉函式,也可以採用下面方法:

bool comp(const int& a, const int& b)

sort(vec.begin(), vec.end(), comp);

用vector陣列建立二維陣列:12

3456

78910

1112

1314

1516

1718

1920

//c++ 構建二維動態陣列

int p;

p = new int[10]; //注意,int[10]表示乙個有10個元素的指標陣列

for (int i = 0; i < 10; ++i)

//用vector構建二維陣列

vectormatrix;

vectora;

a.push_back(1);

a.push_back(3);

a.push_back(1);

matrix.push_back(a);

//或者用下面的方法

int i,j;

vectorarray(5);

for (i = 0; i < array.size(); i++)

array[i].resize(3);//這裡一定要使用resize其相當於每行的元素數並已經初始化過了

使用注意事項:

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

刪除元素:12

3456

78910

11std::vector< int> vec;

std::vector< int>::iterator itvec;

for( itvec = vec.begin(); itvec != vec.end(); )

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}.用迴圈表示,**如下:12

3456

78910

1112

1314

1516

1718

#include

#include

using namespace std;

int main()

;auto iter = vec.begin();

for (; iter != vec.end()?

for (auto num : vec)

cout << num << endl;

return 0;

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

如果需要在每個元素之後插入元素,該怎麼操作?12

3456

78910

1112

1314

1516

1718

1920

#include

#include

using namespace std;

int main()

;auto iter = vec.begin();

iter++;

for (; iter != vec.end()?

vec.insert(vec.end(),8);

for (auto num : vec)

cout << num << endl;

return 0;

}這裡需要對iter首先自增一次,在迴圈最後,由於iter自加兩次,已經和end()函式返回迭代器位置一致,所以需要再insert一次,才能在尾部再插入乙個元素。

關於迭代器失效有一篇總結:

C vector容器 預留空間

vector預留空間 功能描述 減少vector在多型擴充套件容量時的擴充套件次數 函式原型 reserve int len 容器預留len個元素長度,預留位置不初始化,元素不可訪問。當我們往vector容器中push back大量的數,vector就會開闢多次空間,如果我們最開始就告訴vector...

堆空間的開闢與使用

define crt secure no warnings include include include include include int main0101 開闢堆空間 int p int malloc sizeof int printf p n p printf p n p 這裡沒有賦值,...

C 如何在棧上開闢空間

new operator的作用 首先會在堆上開闢一段空間 呼叫的是operator new函式 然後呼叫new operator後面的typename的建構函式 如果是普通型別則不需要 最後new operator typename會返回乙個指向該堆的記憶體位址.如果想要在棧上呼叫new opera...