主頁 >  其他 > C++ vector所有操作,你真的掌握vector了嗎?兩萬總結帶你干穿vector

C++ vector所有操作,你真的掌握vector了嗎?兩萬總結帶你干穿vector

2022-01-03 07:34:34 其他

📋 前言

  • 🖱 博客主頁:在下馬農的碎碎念
  • ? 本文由在下馬農原創,首發于CSDN
  • 📆 首發時間:2022/01/02
  • 📅 最近更新時間:2022/01/02
  • 🤵 此馬非凡馬,房星本是星,向前敲瘦骨,猶自帶銅聲,
  • 📇 系列文章目錄: 暫無
  • 🙏作者水平有限,如發現錯誤,請留言轟炸哦!萬分感謝!
  • 🤗碼字不易 歡迎關注🔎點贊👍收藏??留言📝

在這里插入圖片描述

五歲時,媽媽告訴我,人生的關鍵在于快樂,上學后,人們問我長大了要做什么,我寫下“快樂”,他們告訴我,我理解錯了題目,我告訴他們,他們理解錯了人生,——約翰·列儂

在這里插入圖片描述

以下是正文

Vector目錄

    • 📋 前言
    • 🔥 1、Vector介紹
    • 🔥 2、Vector定義和初始化
    • 🔥 3、Vector的迭代器(必看???)
    • 🔥 4、Vector大小(容量)相關方法(必看???)
      • 🍒 4.1 元素個數:size()
      • 🍒 4.2 vector最多能容納元素個數:max_size()
      • 🍒 4.3 改變vector容量為n: resize(n)
      • 🍒 4.4 當前分配給vector的容量大小:capacity()
      • 🍒 4.5 檢查vector是否為空:empty()
      • 🍒 4.6 要求vector至少能容納n個元素:reserve(n)
      • 🍒 4.7 要求vector減小容量已適應元素個數 【C++11】
    • 🔥 5、Vector常用操作(必看???)
      • 🍒 5.1 添加元素(vector尾部) : push_back()
      • 🍒 5.2 洗掉Vector元素: pop_back()
      • 🍒 5.3 訪問Vector元素: at()
      • 🍒 5.4 訪問Vector頭尾元素: front()和back()
      • 🍒 5.5 指定Vector元素: assign()
      • 🍒 5.6 添加元素(任意位置): insert()
      • 🍒 5.7 洗掉元素(任意位置): erase()
      • 🍒 5.8 清空元素: clear()
      • 🍒 5.9 交換元素: swap()
      • 🍒 5.10 插入元素: emplace() 【C++11】
      • 🍒 5.11 在vector尾部插入元素: emplace_back() 【C++11】
    • 🔥 6、總結(必看???)

🔥 1、Vector介紹

Vector是一種可以改變長度的序列化容器,
與陣列相同的是Vector也使用一段連續的記憶體空間來存盤元素,因此Vector的元素也可以使用與陣列類似的下標來訪問,
但是,不同于陣列,Vector的大小是可以動態改變的,當我們向容器中添加或洗掉元素時,容器會自動改變大小,
Vector是C++ 標準模板庫的一部分,因此,想要使用Vector,需要在程式中包含頭檔案vector

#include<vector>

🔥 2、Vector定義和初始化

格式:
包含頭檔案vector之后,我們可以使用下邊的格式定義vector:

std::vector<object_type> variable_name;

object_type規定了vector中可以存放哪種型別的元素,
variable_name為vector名,

方式: 定義Vector的常用方式如下所示:

vector<Type> v1; 				//v1是一個空vector,可存盤元素型別為T,執行默認初始化
vector<Type> v2(v1);			//v2中包含v1中的所有元素
vector<Type> v2 = v1;			//等價于v2(v1)
vector<Type> v3(n.value);		//v3中有n個元素,并且值都為value
vector<Type> v4(n);				//v4包含了n個重復執行了值初始化的物件
vector<Type> v5{a,b,c.....};	//v5包含大括號中的所有元素
vector<Type> v6 = {a,b,c...}//等價于v5{a,b,c....}

??? 注:最常用的方式是先定義一個空的vector,在需要的時候再一一向vector中添加元素

💻示例代碼💻

#include <vector>
using std::vector;
int main() {
    vector<int> vector1;			// vector1保存int型別物件
    vector<vector<int>> vector2;	// vector2保存vector型別物件
    // vector<ClassType> vector3	// vector3保存自定義型別ClassType型別物件
}

上邊的例子中,創建了幾個存盤不同元素型別的空vector,vector定義時不需要指定長度,

🔥 3、Vector的迭代器(必看???)

???vector中的迭代器包括以下幾個,分別為:

  • vector.begin():指向vector首元素的迭代器
  • vector.end():指向vector尾元素下一個位置的迭代器
  • vector.rbegin():指向vector尾元素的反向迭代器,即rbegin()指向尾元素,rbegin-1指向倒數第二個元素
  • vector.rend():指向vector頭元素前一個位置的反向迭代器,即rend()指向頭元素前一個位置元素,rbegin-1指向第一個元素
  • vector.cbegin():指向vector首元素的迭代器
  • vector.cend():指向vector尾元素下一個位置的迭代器
  • vector.crbegin():指向vector尾元素的反向迭代器
  • vector.crend():指向vector頭元素前一個位置的反向迭代器
    專門畫了一張示意圖,清晰展示各個迭代器:

vector迭代器

代碼示例如下:

💻示例代碼💻

#include <iostream>
#include <vector>

using std::cout;
using std::endl;
using std::vector;

int main() {
    vector<int> test;
    // 初始化vector為1-4
    for (int i = 1; i <= 4; i++) {
        test.push_back(i);
    }

    cout << "初始化后vector為: ";
    for (auto num : test) {
        cout << num << " ";
    }
    cout << endl;

    // vector.begin()為指向vector頭元素的迭代器
    vector<int>::iterator begin_iterator = test.begin();
    cout << "begin() 指向的元素:" << *begin_iterator << endl;

    // vector.end()為指向vector尾元素后一個位置的迭代器,則test.end()-1指向尾元素
    auto end_iterator = test.end();
    cout << "end()-1 指向的元素:" << *(end_iterator - 1) << endl;

    // vector.rbegin()為指向尾元素的迭代器,即反向(r)的頭(begin)迭代器
    auto rbegin_iterator = test.rbegin();
    cout << "rbegin() 指向的元素:" << *rbegin_iterator << endl;

    // vector.rend()為指向頭元素的前一個位置的迭代器,即反向(r)尾(end)迭代器,則test.rend()-1指向頭元素
    auto rend_iterator = test.rend();
    cout << "rend()-1 指向的元素:" << *(rend_iterator - 1) << endl;

    // vector.cbegin()為指向vector頭元素的const迭代器,與begin()不同的是回傳迭代器型別為vector<int>::const_iterator
    vector<int>::const_iterator cbegin_iterator = test.cbegin();
    cout << "cbegin() 指向的元素:" << *cbegin_iterator << endl;

    // vector.cend()為指向vector尾元素下一個位置的const迭代器,與end()不同的是回傳迭代器型別為vector<int>::const_iterator
    vector<int>::const_iterator cend_iterator = test.cend();
    cout << "cend()-1 指向的元素:" << *(cend_iterator-1) << endl;

    // vector.crbegin()為指向尾元素的const迭代器,即反向(r)的const(c)頭(begin)迭代器
    auto crbegin_iterator = test.crbegin();
    cout<<"crbegin() 指向的元素: "<< *crbegin_iterator<<endl;

    // vector.crend()為指向頭元素下一個位置的const迭代器,即反向(r)的const(c)尾(end)迭代器
    auto crend_iterator = test.crend();
    cout<<"crend()-1 指向的元素: " << *(crend_iterator-1)<<endl;

    return 0;
}

📄輸出📄

初始化后vector為: 1 2 3 4
begin() 指向的元素:1
end()-1 指向的元素:4
rbegin() 指向的元素:4
rend()-1 指向的元素:1
cbegin() 指向的元素:1
cend()-1 指向的元素:4
crbegin() 指向的元素: 4
crend()-1 指向的元素: 1

🔥 4、Vector大小(容量)相關方法(必看???)

🍒 4.1 元素個數:size()

要想知道vector中有多少元素,使用vector.size()方法,作用是回傳Vector中元素的個數,示例如下:

💻示例代碼💻

#include <iostream>
#include <vector>
using std::cout;
using std::endl;
using std::vector;

int main() {
    vector<int> test;
    // 初始化test
    for (int i = 1; i <= 5; i++) {
        test.push_back(i);
    }
    cout << "初始化后的test為:";
    for (auto num : test) {
        cout<<num<<" ";
    }
    int sizeOftest = test.size();
    cout<<"\ntest中的元素個數為:"<< sizeOftest;    
}

📄輸出📄

初始化后的test為:1 2 3 4 5
test中的元素個數為:5

🍒 4.2 vector最多能容納元素個數:max_size()

要想知道vector最多可以有多少元素,使用vector.max_size()方法,作用是回傳Vector中最多能容納元素個數,示例如下:

💻示例代碼💻

#include <iostream>
#include <vector>
using std::cout;
using std::endl;
using std::vector;

int main() {
    vector<int> test;
    int sizeOftest = test.size();
    cout<<"\ntest中最多能容納的元素個數為:"<< test.max_size();    
}

📄輸出📄

test中最多能容納的元素個數為:4611686018427387903

🍒 4.3 改變vector容量為n: resize(n)

如果想要改變vector的size,使用vector.resize(n)方法,將vector的size改為n,示例如下:

💻示例代碼💻

#include <iostream>
#include <vector>
using std::cout;
using std::endl;
using std::vector;

int main() {
    vector<int> test;
    // 初始化test
    for (int i = 1; i <= 5; i++) {
        test.push_back(i);
    }
    cout << "初始化后的test為:";
    for (auto num : test) {
        cout << num << " ";
    }
    int sizeOftest = test.size();
    cout << "\ntest中的元素個數為:" << sizeOftest;

    // resize test 為10
    test.resize(10);

    int sizeAfterResize = test.size();
    cout << "\nresize test后test的元素個數為:" << sizeAfterResize;

    cout << "\nresize()后的test為:";
    for (auto num : test) {
        cout << num << " ";
    }
}

📄輸出📄

初始化后的test為:1 2 3 4 5
test中的元素個數為:5
resize test后test的元素個數為:10
resize()后的test為:1 2 3 4 5 0 0 0 0 0

🍒 4.4 當前分配給vector的容量大小:capacity()

要想知道當前分配給vector的容量大小,即vector達到多少個元素后會觸發擴容,使用vector.capacity()方法,作用是回傳當前分配給vector的容量大小,示例如下:

💻示例代碼💻

#include <iostream>
#include <vector>
using std::cout;
using std::endl;
using std::vector;

int main() {
    vector<int> test;
    // 初始化test = [1,2,3,4,5,6,7,8,9,10]
    for (int i = 1; i <= 10; i++) {
        test.push_back(i);
        cout << "test中的元素個數為:" << test.size();
        cout << "\ntest當前被分配的容量為:" << test.capacity();
        cout<<"\n==========================================\n";
    }
}

📄輸出📄

test中的元素個數為:1
test當前被分配的容量為:1
==========================================
test中的元素個數為:2
test當前被分配的容量為:2
==========================================
test中的元素個數為:3
test當前被分配的容量為:4
==========================================
test中的元素個數為:4
test當前被分配的容量為:4
==========================================
test中的元素個數為:5
test當前被分配的容量為:8
==========================================
test中的元素個數為:6
test當前被分配的容量為:8
==========================================
test中的元素個數為:7
test當前被分配的容量為:8
==========================================
test中的元素個數為:8
test當前被分配的容量為:8
==========================================
test中的元素個數為:9
test當前被分配的容量為:16
==========================================
test中的元素個數為:10
test當前被分配的容量為:16
==========================================

通過每次新增一個元素后觀察capacity的變化,可以發現vector當前容量不夠容納新的元素,就會把容量擴大為原來的兩倍,

🍒 4.5 檢查vector是否為空:empty()

想要檢查vector是否為空,使用vector.empty()方法,如果為慷訓傳true,否則回傳false,示例如下:

💻示例代碼💻

#include <iostream>
#include <vector>
using std::cout;
using std::endl;
using std::vector;

int main() {
    vector<int> test;

    cout << "添加元素前test.isempty() = " << test.empty();

    for (int i = 1; i <= 5; i++) {
        test.push_back(i);
    }

    cout << "\n添加元素后test.isempty() = " << test.empty();
}

📄輸出📄

添加元素前test.isempty() = 1
添加元素后test.isempty() = 0

🍒 4.6 要求vector至少能容納n個元素:reserve(n)

要求vector至少能容納n各元素,此時有兩種情況,如果此時vector容量小于n,則容量會被擴大到n;如果此時容量大于n,則容量不變,示例如下:

💻示例代碼💻

#include <iostream>
#include <vector>
using std::cout;
using std::endl;
using std::vector;

int main() {
    vector<int> test;
    // 要求test中至少能容納10個元素
    test.reserve(10);
    cout << "\nreserve后test.size() = " << test.size();
    cout << "\nreserve后test.capacity() = " << test.capacity();

    vector<int> test1;
    // 向test1中添加7個元素,根據前文經驗,此時test1元素個數應為7,容量應為8
    for(int i = 1;i<=7;i++) {
        test1.push_back(i);
    }
    cout << "\nreserve前test1.capacity() = " << test1.capacity();
    // 要求test1中至少能容納4個元素
    test1.reserve(4);
    cout << "\nreserve后test1.capacity() = " << test1.capacity();
}

test沒有添加元素,初始容量為0,test.reserve(10)要求test容量至少為10,則test容量被擴大到10;
test1添加了7個元素,容量被擴大到8,test1.reserve(4)要求test容量至少為4,則test容量不變;

📄輸出📄

reserve后test.size() = 0
reserve后test.capacity() = 10
reserve前test1.capacity() = 8
reserve后test1.capacity() = 8

🍒 4.7 要求vector減小容量已適應元素個數 【C++11】

讓vector盡可能減小容量以適配size,意思就是讓capacity縮小到size,示例如下:

💻示例代碼💻

#include <iostream>
#include <vector>
using std::cout;
using std::endl;
using std::vector;

int main() {
    vector<int> test;
    for (int i = 1; i <= 9; i++) {
        test.push_back(i);
    }
    cout << "\nshrink_to_fit前test.capacity() = " << test.capacity();
    test.shrink_to_fit();
    cout << "\nshrink_to_fit后test.capacity() = " << test.capacity();
}

📄輸出📄

shrink_to_fit前test.capacity() = 16
shrink_to_fit后test.capacity() = 9

🔥 5、Vector常用操作(必看???)

🍒 5.1 添加元素(vector尾部) : push_back()

向vector中添加元素,使用push_back()方法,作用是向vector尾部添加一個元素,示例如下:

💻示例代碼💻

#include<iostream>
#include<vector>

using std::endl;
using std::cout;
using std::vector;

int main() {
    vector<int> test {1,2,3,4,5};

    cout<<"初始化的Vector: ";
    for(auto num : test) {
        cout<<num<<" ";
    }
    cout<<endl;
    test.push_back(6);				// 向test尾部添加元素6
    test.push_back(7);				// 向test尾部添加元素7
    test.push_back(8);				// 向test尾部添加元素8
    cout<<"添加元素后的Vector: ";
    for(auto num : test) {
        cout<<num<<" ";
    }
    return 0;
}

📄輸出📄

初始化的Vector: 1 2 3 4 5
添加元素后的Vector: 1 2 3 4 5 6 7

??注意點??

? 可以使用下標訪問vector的元素,如使用test[0] 訪問test的第一個元素,會得到1
🈲 不可以使用下標添加元素,如當前有8個元素,不可以用test[8] = 9,這種方式添加第九個元素,
📣 使用push_back()方法添加元素最為常用,初次之外,還可以使用insert()方法和emplace()方法

🍒 5.2 洗掉Vector元素: pop_back()

洗掉vector中的元素,使用pop_back()方法,作用是洗掉vector尾部的一個元素,示例如下:

💻示例代碼💻

#include<iostream>
#include<vector>

using std::endl;
using std::cout;
using std::vector;

int main() {
    vector<int> test {1,2,3,4,5};
    // 初始化后
    cout << "初始化的 Vector: ";
    for (int num : test) {
        cout << num << " ";
    }
    // 洗掉vector最后一個元素
    test.pop_back();
    // 洗掉后
    cout << "\n洗掉元素的 Vector: ";
    for (int num : test) {
        cout << num << " ";
    }

    return 0;
}

📄輸出📄

初始化的 Vector: 1 2 3 4 5
洗掉元素的 Vector: 1 2 3 4

🍒 5.3 訪問Vector元素: at()

使用元素的索引來訪問Vector中的元素,在vector中,可以使用vector.at(index)或者vector[index]訪問索引為index的元素,示例代碼如下:

💻示例代碼💻

#include<iostream>
#include<vector>

using std::endl;
using std::cout;
using std::vector;

int main() {
    vector<int> test {1,2,3,4,5};
    
    cout<< "test索引為0的元素"<< test.at(0) << endl;
    cout<< "test索引為1元素"<< test.at(1) << endl;
    cout<< "test索引為2元素"<< test[2] << endl;
    return 0;
}

📄輸出📄

test索引為0的元素1
test索引為1元素2
test索引為2元素3

🔱兩種訪問方法的優劣🔱
雖然使用 vector.at(index)vector[index]的方式都能訪問索引為index的元素,但是,如果此元素不存在,即索引越界時, vector.at(index)會拋出一個例外,但是vector[index]會回傳一個垃圾值,因此,最好使用vector.at(index)

🍒 5.4 訪問Vector頭尾元素: front()和back()

?front()回傳vector第一個元素,back()回傳vector最后一個元素?

示例如下:

#include <iostream>
#include <vector>
using std::cout;
using std::endl;
using std::vector;

int main() {
    vector<int> test;
    // 初始化test為【1,2,3,4,5】
    for (int i = 1; i <= 5; i++) {
        test.push_back(i);
    }

    cout << "test的第一個元素為:" <<test.front()<< endl;
    cout << "test的最后一個元素為:" <<test.back()<< endl;
}

📄輸出📄

test的第一個元素為:1
test的最后一個元素為:5

🍒 5.5 指定Vector元素: assign()

?assign的作用就是用新的元素替換vector中舊的元素?

1??**用法一:vector.assign(num,value)**1??

這種用法會用num個value填充vector,如果操作前vector中有其他元素,會被覆寫掉,示例如下:

💻示例代碼💻

#include<iostream>
#include<vector>

using std::endl;
using std::cout;
using std::vector;
using std::string;


int main() {
    vector<string> test {"dog","cat","rabbit"};

    // 初始化
    cout << "初始化的 Vector: ";
    for (string animal : test) {
        cout << animal << " ";
    }
    // 指定vector元素,2個"sheep"
    test.assign(2,"sheep");
    // 指定元素后
    cout << "\n指定元素的 Vector: ";
    for (string animal : test) {
        cout << animal << " ";
    }
    
    return 0;
}

📄輸出📄

初始化的 Vector: dog cat rabbit
指定元素的 Vector: sheep sheep


2??**用法二:vector.assign(iterator1,iterator2)**2??

這種用法會用兩個迭代器iterator1和iterator2之間的元素覆寫vector的元素,迭代器可以是原來vector的迭代器,也可以是其他vector的迭代器,注意區間是左閉右開[iterator1,iterator2),即iterator1指向的元素在區間內,iterator2指向的元素不在區間內,iterator2可以是vector.end,

3??**用法三:vector.assign(address1,address2)**3??

這種用法會用兩個陣列元素地址address1和address2之間的元素覆寫vector的元素,注意區間仍是左閉右開[*address1,*address2),即address1指向的元素在區間內,address2指向的元素不在區間內,用法2和用法3示例如下:

💻示例代碼💻

#include<iostream>
#include<vector>

using std::endl;
using std::cout;
using std::vector;
using std::string;


int main() {
    vector<string> test {"dog","cat","rabbit","pig","fish"};

    // 初始化
    cout << "初始化的 Vector: ";
    for (string animal : test) {
        cout << animal << " ";
    }

    vector<string>::iterator it;
    // begin()回傳指向vector第一個元素的迭代器,end()回傳指向vector最后一個元素后邊一位的迭代器,詳細介紹見下文迭代器章節
    it = test.begin();
    // 指定vector元素,it+1指向cat,end-1指向fish"
    // 用[it+1,end-1)之間元素覆寫舊的元素
    test.assign(it+1,test.end()-1);
    // 使用迭代器指定元素后
    cout << "\n使用迭代器指定元素的 Vector: ";
    for (string animal : test) {
        cout << animal << " ";
    }

    // 使用陣列元素地址指定vector元素
    string mystrs[] = {"bird","snack","dragon"};
    test.assign(mystrs,mystrs+2);
    cout << "\n使用陣列元素地址指定元素的 Vector: ";
    for (string animal : test) {
        cout << animal << " ";
    }
    return 0;
}

📄輸出📄

初始化的 Vector: dog cat rabbit pig fish
使用迭代器指定元素的 Vector: cat rabbit pig
使用陣列元素地址指定元素的 Vector: bird snack

🍒 5.6 添加元素(任意位置): insert()

向vector中添加元素,使用insert(iterator,value)方法,作用是向iterator迭代器指向元素的前邊添加一個元素value,示例如下:

💻示例代碼💻

#include<iostream>
#include<vector>

using std::endl;
using std::cout;
using std::vector;
using std::string;


int main() {
    vector<int> test {1,2,3,4,5};

    // 初始化
    cout << "初始化的 Vector: ";
    for (int num : test) {
        cout << num << " ";
    }

    vector<int>::iterator it;
    // begin回傳指向vector第一個元素的迭代器
    it = test.begin();
    
    // it指向vector第一個元素,則把9插入到1之前
    test.insert(it,9);
    
    cout << "\n插入元素后的 Vector: ";
    for (int num : test) {
        cout << num << " ";
    }
    return 0;
}

📄輸出📄

初始化的 Vector: 1 2 3 4 5
插入元素后的 Vector: 9 1 2 3 4 5

🍒 5.7 洗掉元素(任意位置): erase()

?erase的作用就是根據傳入的迭代器洗掉vector中的元素,引數為一個迭代器,只洗掉迭代器指向的元素;引數為兩個迭代器,洗掉兩個迭代器之間的元素?

1??**用法一:vector.erase(iterator)**1??

這種用法會洗掉迭代器iterator指向的元素,示例如下:

💻示例代碼💻

#include<iostream>
#include<vector>

using std::endl;
using std::cout;
using std::vector;

int main() {
    vector<int> test ;
    // initial vector
    for(int i = 1;i<=8;i++) {
        test.push_back(i);
    }
    // 初始化后的vector:
    cout<<"初始化后的vector: ";
    for(auto num : test) {
        cout<<num<<" ";
    }
    // 使用erase擦除一個元素
    vector<int>::iterator it;
    // test.begin()指向第一個元素,加二后指向第三個元素
    it = test.begin()+2;
    test.erase(it);

    // 擦除元素后的vector:
    cout<< "\n擦除元素后的vector:";
    for(auto num : test) {
        cout<< num << " ";
    }
}

📄輸出📄

初始化后的vector: 1 2 3 4 5 6 7 8
擦除元素后的vector:1 2 4 5 6 7 8


2??**用法二:vector.erase(iterator1,iterator2)**2??

這種用法會洗掉迭代器iterator1指向的元素到iterator2指向元素之間的元素,包括iterator1指向的元素但不包括iterator2指向的元素,即擦除[iterator1,iterator2),示例如下:

💻示例代碼💻

#include<iostream>
#include<vector>

using std::endl;
using std::cout;
using std::vector;

int main() {
    vector<int> test ;
    // initial vector
    for(int i = 1;i<=8;i++) {
        test.push_back(i);
    }
    // 初始化后的vector:
    cout<<"初始化后的vector: ";
    for(auto num : test) {
        cout<<num<<" ";
    }
    // 使用erase擦除一個元素
    vector<int>::iterator it1;
    vector<int>::iterator it2;
    // test.begin()指向第1個元素,加1后指向第2個元素
    it1 = test.begin()+1;
    // test.begin()指向第1個元素,加5后指向第6個元素
    it2 = test.begin()+5;
    test.erase(it1,it2);

    // 擦除元素后的vector:
    cout<< "\n擦除元素后的vector:";
    for(auto num : test) {
        cout<< num << " ";
    }
}

📄輸出📄

初始化后的vector: 1 2 3 4 5 6 7 8
擦除元素后的vector:1 6 7 8

🍒 5.8 清空元素: clear()

?clear的作用就是清空vector中的所有元素?

清空vector中所有元素,使用clear()方法,示例如下:

💻示例代碼💻

#include<iostream>
#include<vector>

using std::endl;
using std::cout;
using std::vector;

int main() {
    vector<int> test ;
    // initial vector
    for(int i = 1;i<=8;i++) {
        test.push_back(i);
    }
    // 初始化后的vector:
    cout<<"初始化后的vector: ";
    for(auto num : test) {
        cout<<num<<" ";
    }
    // 使用clear清空vector
    test.clear();

    // 清空元素后的vector:
    cout<< "\nvector.size() = "<<test.size();
    cout<< "\n清空元素后的vector:";
    for(auto num : test) {
        cout<< num << " ";
    }
}

📄輸出📄

初始化后的vector: 1 2 3 4 5 6 7 8
vector.size() = 0
清空元素后的vector:

🍒 5.9 交換元素: swap()

?swap的作用就是交換兩個vector的元素?

交換兩個vector的元素,使用swap()方法,vector1.swap(vector2),兩個vector存盤的元素型別必須相同,元素個數可以不同,示例如下:

💻示例代碼💻

#include<iostream>
#include<vector>

using std::endl;
using std::cout;
using std::vector;

int main() {
    vector<int> test1 ;
    vector<int> test2 ;
    // initial vector
    for(int i = 1;i<=8;i++) {
        test1.push_back(i);
    }
    for(int i = 10;i<=14;i++) {
        test2.push_back(i);
    }
    // 初始化后的vector:
    cout<<"初始化后的test1: ";
    for(auto num : test1) {
        cout<<num<<" ";
    }
    cout<<"\n初始化后的test2: ";
    for(auto num : test2) {
        cout<<num<<" ";
    }
    // 使用swap交換test1和test2
    test1.swap(test2);

    // 交換元素后的test1:
    cout<< "\n交換元素后的test1:";
    for(auto num : test1) {
        cout<< num << " ";
    }
    cout<< "\n交換元素后的test2:";
    for(auto num : test2) {
        cout<< num << " ";
    }
}

📄輸出📄

初始化后的test1: 1 2 3 4 5 6 7 8
初始化后的test2: 10 11 12 13 14
交換元素后的test1:10 11 12 13 14
交換元素后的test2:1 2 3 4 5 6 7 8

🍒 5.10 插入元素: emplace() 【C++11】

向vector中添加元素,使用emplace(iterator,value)方法,作用是向iterator迭代器指向元素的前邊添加一個元素value,回傳一個迭代器,指向新添加的元素,示例如下:

💻示例代碼💻

#include <iostream>
#include <vector>
using std::cout;
using std::endl;
using std::vector;

int main() {
    vector<int> test;
    // 初始化test為【1,2,3,4,5】
    for (int i = 1; i <= 5; i++) {
        test.push_back(i);
    }

    cout << "初始化后的test為:";
    for (auto num : test) {
        cout << num << " ";
    }

    // 向begin()指向元素之前插入一個元素,回傳迭代器it指向新元素
    auto it = test.emplace(test.begin(),100);
    cout << "\n使用emplace在test.begin()前插入元素后的test為:";
    for (auto num : test) {
        cout << num << " ";
    }

    // 在上邊插入的新元素100前插入元素
    test.emplace(it,200);
    cout << "\n使用emplace在100前插入元素后的test為:";
    for (auto num : test) {
        cout << num << " ";
    }

    // 在test尾部插入元素,即test.end()的前邊
    test.emplace(test.end(),300);
    cout << "\n使用emplace在test.end()前(即test尾部)插入元素后的test為:";
    for (auto num : test) {
        cout << num << " ";
    }
}

📄輸出📄

初始化后的test為:1 2 3 4 5
使用emplace在test.begin()前插入元素后的test為:100 1 2 3 4 5
使用emplace在100前插入元素后的test為:200 100 1 2 3 4 5
使用emplace在test.end()前插入元素后的test為:200 100 1 2 3 4 5 300

🍒 5.11 在vector尾部插入元素: emplace_back() 【C++11】

向vector中添加元素,使用emplace_back(iterator,value)方法,作用是向vector尾部添加一個元素value,示例如下:

💻示例代碼💻

#include <iostream>
#include <vector>
using std::cout;
using std::endl;
using std::vector;

int main() {
    vector<int> test;
    // 初始化test為【1,2,3,4,5】
    for (int i = 1; i <= 5; i++) {
        test.push_back(i);
    }

    cout << "初始化后的test為:";
    for (auto num : test) {
        cout << num << " ";
    }

    // 向test尾部插入一個元素
    test.emplace_back(100);
    cout << "\n向test尾部插入一個元素后的test為:";
    for (auto num : test) {
        cout << num << " ";
    }
}

📄輸出📄

初始化后的test為:1 2 3 4 5
向test尾部插入一個元素后的test為:1 2 3 4 5 100

🔥 6、總結(必看???)

Vector所有方法總結如下:

方法名作用備注
begin()指向vector首元素的迭代器vector<Type>::iterator
end()指向vector尾元素下一個位置的迭代器vector<Type>::iterator
rbegin()指向vector尾元素的反向迭代器,即rbegin()指向尾元素,rbegin-1指向倒數第二個元素vector<Type>::iterator
rend()指向vector頭元素前一個位置的反向迭代器,即rend()指向頭元素前一個位置元素,rbegin-1指向第一個元素vector<Type>::iterator
cbegin()指向vector頭元素的const迭代器,與begin()不同的是回傳迭代器型別為vector::const_iteratorvector<Type>::const_iterator
cend()指向vector尾元素下一個位置的const迭代器,與end()不同的是回傳迭代器型別為vector::const_iteratorvector<Type>::const_iterator
crbegin()指向尾元素的const迭代器,即反向?的const?頭(begin)迭代器vector<Type>::const_iterator
crend()指向頭元素下一個位置的const迭代器,即反向?的const?尾(end)迭代器Vector<Type>::const_iterator
size()回傳vector中元素個數-
max_size()回傳vector中最多能容納元素個數-
resize(n)改變vector的大小為n如果n比當前vector中元素個數大,則填充默認值
capacity()當前分配給vector的容量大小-
empty()判斷vector是否為空-
reserve(n)改變當前vecotr所分配空間的大小capacity為n如果當前capacity大于n,則不變
shrink_to_fit()改變當前vecotr所分配空間的大小為size()-
push_back()在vector的最后添加一個資料-
pop_back()去掉vector的最后一個資料-
at(i)得到編號位置i的資料-
front()得到vector頭元素的參考-
back()得到vector的最后一個元素的參考-
assign()用新的元素替換vector中舊的元素-
insert()添加元素(任意位置)-
erase()洗掉元素(任意位置)-
clear()清空vector中的所有元素-
swap()交換兩個vector的元素-
emplace()向vector中添加元素-
emplace_back()在vector尾部插入元素-

結語: 本文詳細總結了vector容器的一些方法,包括vector使用,vector初始化,vector迭代器,vector所有操作,
vector begin(); vector end(); vector rbegin(); vector rend(); vector cbegin(); vector cend(); vector crbegin(); vector crend(); vector size(); vector max_size(); vector resize(n);vector capacity(); vector empty(); vector reserve(n); vector shrink_to_fit(); vector push_back(); vector pop_back() ;vector at(i);vector front(); vector back(); vector assign(); vector insert(); vector erase(); vector clear(); vector swap(); vector emplace(); vector emplace_back();
希望大家看完后能對vector的掌握更加深刻,
歡迎關注🔎點贊👍收藏??留言📝

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/401523.html

標籤:其他

上一篇:Linux 命令合集 文本處理和正則運算式相關命令之四

下一篇:Gitea——私有git服務器搭建詳細教程

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more