最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++ vector容器縮小capacity問題

 更新時間:2023年08月09日 10:57:48   作者:白白白白白kkk  
這篇文章主要介紹了C++ vector容器縮小capacity問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

C++ vector容器縮小capacity

vector容器是動態(tài)存儲的,跟數(shù)組不同,定義vector的時候不需要聲明容器的capacity。

首先說明一點,size是小于等于capacity的,一旦size超過了capacity,整個vector容器會“另辟居所”重新開辟更多的空間,這樣也就造成了vector容器首地址發(fā)生改變。

下面是容器的size和capacity的關系:

#include<iostream>
#include<vector>
using namespace std;
int main()
{
    vector<int> v0;
    for (int i = 0; i < 100;i++)
    {
        v0.push_back(i);
    }
    cout << "v0 capacity is " << v0.capacity() << endl;//128
    cout << "v0 size is " << v0.size() << endl;//100
    vector<int> v1;
    for (int i = 0; i < 10000;i++)
    {
        v1.push_back(i);
    }
    cout << "v1 capacity is " << v1.capacity() << endl;//16384
    cout << "v1 size is " << v1.size() << endl;//10000
    return 0;
}

可以看出,vector容器會根據(jù)你傳入的數(shù)據(jù)數(shù)量進行自動擴展,總是比你存入的數(shù)據(jù)多一些。

但是有一些時候我們不需要那么多開辟好的空間,對于數(shù)據(jù)size是確定的,這時候可以用匿名vector交換vector

先介紹一下vector的內(nèi)置函數(shù)swap(),只貼核心代碼了:

    vector<int> v1;
    v1.reserve(10000);//預設一個空間大小
    for (int i = 0; i < 100;i++)
    {
        v1.push_back(i);
    }
    cout << "v1 capacity is " << v1.capacity() << endl;//10000
    cout << "v1 size is " << v1.size() << endl;//100
    vector<int> v2;
    v2.reserve(5000);
    for (int i = 0; i < 50;i++)
    {
        v2.push_back(i);
    }
    cout << "v2 capacity is " << v2.capacity() << endl;//5000
    cout << "v2 size is " << v2.size() << endl;//50
    v2.swap(v1);
    cout << "v1 capacity is " << v1.capacity() << endl;//5000
    cout << "v1 size is " << v1.size() << endl;//50
    cout << "v2 capacity is " << v2.capacity() << endl;//10000
    cout << "v2 size is " << v2.size() << endl;//100

reserve()函數(shù)是預設一個大小,不會使其反復開辟,當然如果后續(xù)超過這個預設值,vector容器還是會自動開辟的。

上面的代碼旨在展示swap()函數(shù)交換的是一整個容器,包含的是容器的capacity和數(shù)據(jù)的size。

交換縮小vector:

#include<iostream>
#include<vector>
using namespace std;
int main()
{
    vector<int> v1;
    for (int i = 0; i < 10000;i++)
    {
        v1.push_back(i);
    }
    cout << "v1 capacity is " << v1.capacity() << endl;//16384
    cout << "v1 size is " << v1.size() << endl;//10000
    v1.resize(3);
    cout << "v1 capacity is " << v1.capacity() << endl;//16384
    cout << "v1 size is " << v1.size() << endl;//3
    vector<int> temp(v1);
    cout << "temp capacity is " << temp.capacity() << endl;//3
    cout << "temp size is " << temp.size() << endl;//3
    temp.swap(v1);
    cout << "v1 capacity is " << v1.capacity() << endl;//3
    cout << "v1 size is " << v1.size() << endl;//3
    vector<int>(v1).swap(v1);//匿名容器,用后自動銷毀。除了沒有自己的變量名,其他的一樣
    cout << "v1 capacity is " << v1.capacity() << endl;//3
    cout << "v1 size is " << v1.size() << endl;//3
    return 0;
}

上面的代碼可以看出:

一個vector如果是通過拷貝構造的,那么他的size和capacity相同,且等同于被拷貝的那個容器的size。

結合上面第二點的發(fā)現(xiàn),swap函數(shù)是一整個交換的,這樣理論上就可以用temp和v1換,最后使v1的size=capacity,節(jié)省了空間。另外,使用匿名容器更加高效方便。

C++ vector容器的常用用法

vector可以說是一個動態(tài)數(shù)組,它可以存儲任何類型的數(shù)據(jù),包括類!

使用vector需包含頭文件 #include< vector > .

一、不帶參數(shù)

// 定義了一個int類型的容器
vector<int> v1;
// 定義了一個double類型的容器
vector<double> v2;

注意事項:容器可以使用數(shù)組方式獲取它的值 和 給它賦值,但是得注意越界!

例如:不可以使用數(shù)組方式給他賦值,因為容器并沒有給他分配內(nèi)容空間:

vector<int> v1;
// 不可以使用數(shù)組方式給他賦值,因為容器并沒有給他分配內(nèi)容空間
v1[0] = 1;	// error
// 可以使用數(shù)組方式給他賦值:
vector<int> v2(10);
v2[0] = 1;	// 正確
v2[11] = 11; // 錯誤,越界

二、帶參數(shù)

1.定義了一個int類型的容器,定義時指定給他分配十個元素的空間

// 定義了一個int類型的容器,定義時指定給他分配十個元素的空間
vector<int> v1(10);

默認10個元素都是零值。

2.定義時指定10個元素的內(nèi)存,同時給所有元素賦值666

vector<int> v3(10, 666);

3.定義時可以使用其他容器來初始化自己

vector<int> v1(5, 666);
// 定義時可以使用其他容器來初始化自己
vector<int> v2(v1);	// v1 和 v2 相等

4.// 也可以使用 返回迭代器 的方式將一個容器的元素全都賦值給自己

vector<int> v1(5, 666);
vector<int> v2(v1.begin(), v1.end());

5.begin 和 end 返回來的就是一個指針迭代器,所以可以進行加減操作,指向其他元素的位置

vector<int> v1(5, 666);
// 將v1的元素從第三個元素到最后的元素賦值給v2
vector<int> v2(v1.begin() + 2, v1.end());

6.可以使用數(shù)組來初始化容器

int Array[5] = {1, 2, 3, 4, 5};
// 將數(shù)組元素1,2,3,4給容器賦初值
vector<int> v1 = (Array, Array+3);

size 獲取容器的元素個數(shù)

  • size()
vector<int> v1;
v1.size();

capacity 獲取容器的大小

  • capacity()
vector&lt;int&gt; v1;v1.capacity();

begin 獲取容器第一個元素的迭代器

  • begin()
vector<int> v1(10, 666);
v1.begin();

end 指向容器最后一個元素的下一個位置的迭代器

  • end()
vector<int> v1(10, 666);
v1.end();

assign 賦值玩法

  • 第一種玩法 會改變原來vector中的元素內(nèi)存大小

將v1元素修改為5個,并且賦值888

vector<int> v1(10);
v1.assign(5, 888);	// 打印結果5個888
  • 第二種玩法,使用迭代器賦值

將容器v2的10個1賦值給v1,使得v1和v2相等

vector<int> v1(5);
vector<int> v2(10, 1);
v1.assign(v2.begin(), v2.end());	// 打印結果10個1
  • 第三種玩法,使用指針賦值

將數(shù)組的所有元素都賦值給v1

int Array[5] = { 9, 8, 7, 6, 5 };
vector<int> v1;
v1.assign(Array, Array + 4);	// 打印結果9,8,7,6,5
  • 第四種玩法,使用賦值運算符重載

將v1所有元素賦值給v2

vector<int> v1(10, 1);
vector<int> v2;
v2 = v1;	// 打印結果10個1

resize 將容器縮小和變大

一、把容器元素縮小

vector<int> v1(10);
v1.resize(5);	// 縮小長度為5

二、把容器擴大時,并給增加的元素賦值

vector<int> v1(5);
v1.resize(8, 111);	// 擴充v1容器的大小為8,后續(xù)新增加的使用111賦值

三、把容器擴大,不給增加的元素賦值

vector<int> v1(5);
v1.resize(15);

empty 判斷容器是否為空

為空返回true,為假返回false

vector<int> v1(5);
if (v1.empty() == NULL) {
	cout << "v1為空!" << endl;
}

push_back 尾部添加一個元素

vector<int> v1;
v1.push_back(1);	// 在尾部增加要給1

pop_back 尾部刪除一個元素

vector<int> v1(10);
v1.pop_back();	// 在尾部刪除一個元素

at 和數(shù)組使用方式差不多

給第一個元素賦值1

vector<int> v1(10);
v1.at(0) = 1; 

打印輸出容器里的所有元素

cout << "v1的所有元素:";
for (int i = 0; i < v1.size(); i++) {
	cout << v1.at(i) << ", ";
}

front 獲取容器的第一個元素

vector<int> v1(10);
v1.front();
// 也可以使用他們賦值
v1.front() = 111;	// 給第一個元素賦值111

back 獲取容器的最后一個元素

vector<int> v1(10);
v1.back();
// 也可以使用他們賦值
v1.back() = 222;	// 給最后一個元素賦值222

insert 元素的插入

vector<int> v1(10);
// 往第一個元素的位置插入一個5
v1.insert(v1.begin(), 5);
// 從第三個元素位置開始插入5個222
v1.insert(v1.begin() + 2, 5, 222);
vector<int> v2(3, 111);
// 從第二個元素開始插入v2的所有值
v1.insert(v1.begin() + 1, v2.begin(), v2.end());

erase 與 clear 元素刪除

vector<int> v1(10);
// 刪除第一個元素
v1.erase(v1.begin());
// 刪除第一個到第三個元素
v1.erase(v1.begin(), v1.begin() + 3);
// 刪除全部元素
v1.clear();

匯總代碼:

#include <iostream>
#include <Windows.h>
#include <vector>
using namespace std;
// 不帶參數(shù)的
void text1(void) {
	vector<int> v1;
	cout << "v1的元素個數(shù):";
	cout << v1.size() << endl;
	cout << "v1容器的大?。?;
	cout << v1.capacity() << endl;
	v1.push_back(1);
	v1.push_back(2);
	cout << endl << "v1插入兩個元素后:" << endl;
	cout << "v1的元素個數(shù):";
	cout << v1.size() << endl;
	cout << "v1容器的大?。?;
	cout << v1.capacity() << endl;
	/*
	注意:
		不可以使用數(shù)組方式給他賦值,因為容器并沒有給他分配內(nèi)容空間:
			vector<int> v;
			v[0] = 1;	// error
	*/
}
// 帶參數(shù)的
void text2(void) {
	vector<int> v2(10);	// 定義時指定給他分配十個元素的空間
	cout << "v2的元素個數(shù):";
	cout << v2.size() << endl;
	cout << "v2容器的大?。?;
	cout << v2.capacity() << endl;
	// 里面默認的值全為零
	cout << "v2里面的元素為:" << endl;
	vector<int>::iterator it = v2.begin();
	for (; it != v2.end(); it++) {
		cout << *it << ", ";
	}
	cout << endl;
	/*
	可以使用數(shù)組方式給他賦值:
		vector<int> v(10);
		v[0] = 1;	// 正確
	*/
	v2[0] = 1;	// 正確
	v2[1] = 2;
	cout << "v2里面的元素為:" << endl;
	it = v2.begin();
	for (; it != v2.end(); it++) {
		cout << *it << ", ";
	}
	cout << endl;
	/************************************************************************************************/
	vector<int> v3(10, 666);	// 定義時指定10個元素的內(nèi)存,同時給所有元素賦值666
	cout << "v3里面的元素為:" << endl;
	it = v3.begin();
	for (; it != v3.end(); it++) {
		cout << *it << ", ";
	}
	cout << endl;
	/************************************************************************************************/
	vector<int> v4(v3);	// 定義時可以使用其他容器來初始化自己
	cout << "v4里面的元素為:" << endl;
	it = v4.begin();
	for (; it != v4.end(); it++) {
		cout << *it << ", ";
	}
	cout << endl;
	/************************************************************************************************/
	vector<int> v5(v2.begin(), v2.end());	// 也可以使用該種方式將v2的元素全都賦值給自己
	cout << "v5里面的元素為:" << endl;
	it = v5.begin();
	for (; it != v5.end(); it++) {
		cout << *it << ", ";
	}
	cout << endl;
	/************************************************************************************************/
	vector<int> v6(v2.begin() + 1, v2.end());	// begin返回來的就是一個指針迭代器,所以可以進行加1操作,指向下一個元素
	cout << "v6里面的元素為:" << endl;
	it = v6.begin();
	for (; it != v6.end(); it++) {
		cout << *it << ", ";
	}
	cout << endl;
	/************************************************************************************************/
	int text[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
	vector<int> v7(text, text + 5);	// 可以使用這種方式獲取數(shù)組的值初始化自己(1,2,3,4,5)
	cout << "v7里面的元素為:" << endl;
	it = v7.begin();
	for (; it != v7.end(); it++) {
		cout << *it << ", ";
	}
	cout << endl;
}
// vector容器賦值assign玩法
void assign(void) {
	vector<int> v1(5);
	// 第一種玩法	會改變原來vector中的元素內(nèi)存大小
	v1.assign(3, 8);
	cout << "玩法一:" << endl;
	vector<int>::iterator it = v1.begin();
	for (; it != v1.end(); it++) {
		cout << *it << ", ";
	}
	cout << endl;
	// 第二種玩法,使用迭代器賦值
	vector<int> v2(10, 1);
	v1.assign(v2.begin(), v2.end());
	cout << "玩法二:" << endl;
	it = v1.begin();
	for (; it != v1.end(); it++) {
		cout << *it << ", ";
	}
	cout << endl;
	// 第三種玩法,使用指針賦值
	int Array[5] = { 9, 8, 7, 6, 5 };
	v1.assign(Array, Array + 2);
	cout << "玩法三:" << endl;
	it = v1.begin();
	for (; it != v1.end(); it++) {
		cout << *it << ", ";
	}
	cout << endl;
	// 第四種玩法,使用賦值運算符重載
	vector<int> v3;
	v3 = v1;
	cout << "玩法四:" << endl;
	it = v3.begin();
	for (; it != v3.end(); it++) {
		cout << *it << ", ";
	}
	cout << endl;
}
// resize將容器縮小和變大 與 empty判斷容器是否為空
void text3(void) {
	vector<int> v1(10);
	// 一、把容器元素縮小
	cout << "v1的元素個數(shù):" << v1.size() << endl;
	v1.resize(5);	// 調整他的元素個數(shù)為5
	cout << "v1的元素個數(shù):" << v1.size() << endl;
	// 二、把容器擴大時,并給增加的元素賦值
	v1.resize(8, 111);	// 擴充v1容器的大小為8,后續(xù)新增加的使用111賦值
	cout << "v1的元素個數(shù):" << v1.size() << endl;
	cout << "v1的所有元素:";
	for (int i = 0; i < v1.size(); i++) {
		cout << v1[i] << ", ";
	}
	cout << endl;
	// 三、把容器擴大,不給增加的元素賦值
	v1.resize(15);
	cout << "v1的元素個數(shù):" << v1.size() << endl;
	cout << "v1的所有元素:";
	for (int i = 0; i < v1.size(); i++) {
		cout << v1[i] << ", ";
	}
	cout << endl;
	cout << endl << endl << "---empty---" << endl;
	// 判斷容器是否為空
	vector<int> v2;
	if (v2.empty()) {
		cout << "v2為空!" << endl;
	}
}
// 尾部添加和刪除
void text4(void) {
	vector<int> v1;
	cout << "v1的元素個數(shù):" << v1.size() << endl;
	// 尾部添加一個元素
	v1.push_back(666);
	cout << "v1的元素個數(shù):" << v1.size() << endl;
	// 尾部刪除一個元素
	v1.pop_back();
	cout << "v1的元素個數(shù):" << v1.size() << endl;
}
// at 與 front 與 back
void text5(void) {
	vector<int> v1(10);
	// 可以使用at修改容器里面的值,返回的是一個引用
	v1.at(0) = 888;
	// 和數(shù)組方式差不多
	v1[1] = 999;
	// 輸出
	cout << "v1的所有元素:";
	for (int i = 0; i < v1.size(); i++) {
		cout << v1[i] << ", ";
	}
	cout << endl;
	// 也可以使用at輸出
	cout << "v1的所有元素:";
	for (int i = 0; i < v1.size(); i++) {
		cout << v1.at(i) << ", ";
	}
	cout << endl;
	// 他們返回的都是一個引用
	cout << "第一個元素:" << v1.front() << endl;
	cout << "最后一個元素:" << v1.back() << endl;
	// 也可以使用他們賦值
	v1.front() = 111;
	v1.back() = 222;
	cout << "v1的所有元素:";
	for (int i = 0; i < v1.size(); i++) {
		cout << v1.at(i) << ", ";
	}
	cout << endl;
}
// insert 元素的插入
void text6(void) {
	vector<int> v1(10);
	// 往第一個元素的位置插入一個5
	v1.insert(v1.begin(), 5);
	// 從第三個元素位置開始插入5個222
	v1.insert(v1.begin() + 2, 5, 222);
	vector<int> v2(3, 111);
	// 從第二個元素開始插入v2的所有值
	v1.insert(v1.begin() + 1, v2.begin(), v2.end());
	cout << "v1的所有元素:";
	for (int i = 0; i < v1.size(); i++) {
		cout << v1.at(i) << ", ";
	}
	cout << endl;
}
// 元素刪除
void text7(void) {
	vector<int> v1(10);
	// 刪除第一個元素
	v1.erase(v1.begin());
	// 刪除第一個到第三個元素
	v1.erase(v1.begin(), v1.begin() + 3);
	// 刪除全部元素
	v1.clear();
}
int main(void) {
	//text1();
	//text2();
	//assign();
	//text3();
	//text4();
	//text5();
	//text6();
	//text7();
	system("pause");
	return 0;
}

注意:

vector容器常用的函數(shù)已經(jīng)列出來了,剩下還有很多個不常用的,就不說明了,需要用到的話,再另行百度吧!

總結

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • C++11中std::packaged_task的使用詳解

    C++11中std::packaged_task的使用詳解

    這篇文章主要介紹了C++11中std::packaged_task的使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-02-02
  • C++中string轉換為char*類型返回后亂碼問題解決

    C++中string轉換為char*類型返回后亂碼問題解決

    這篇文章主要介紹了C++中string轉換為char*類型返回后亂碼問題解決,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-07-07
  • C語言基本排序算法之桶式排序實例

    C語言基本排序算法之桶式排序實例

    這篇文章主要介紹了C語言基本排序算法之桶式排序,簡單說明了桶式排序的原理并結合具體實例給出了C語言實現(xiàn)桶式排序算法的具體步驟與相關操作技巧,需要的朋友可以參考下
    2017-09-09
  • c++ 獲取數(shù)字字符串的子串數(shù)值性能示例分析

    c++ 獲取數(shù)字字符串的子串數(shù)值性能示例分析

    這篇文章主要為大家介紹了c++ 獲取數(shù)字字符串的子串數(shù)值示例分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-11-11
  • C語言 循環(huán)詳解及簡單代碼示例

    C語言 循環(huán)詳解及簡單代碼示例

    本文主要介紹C語言的循環(huán)知識,這里整理了循環(huán)的基礎資料并附簡單的代碼示例詳細講解,有需要的小伙伴可以參考下
    2016-08-08
  • 基礎C語言編程時易犯錯誤有哪些

    基礎C語言編程時易犯錯誤有哪些

    基礎C語言編程時易犯錯誤有哪些?這篇文章主要介紹了C語言編程時常見的錯誤,感興趣的小伙伴們可以參考一下
    2016-11-11
  • 關于C語言程序的內(nèi)存分配的入門知識學習

    關于C語言程序的內(nèi)存分配的入門知識學習

    這篇文章主要介紹了關于C語言程序的內(nèi)存分配的入門知識學習,特別強調了堆與棧的內(nèi)存空間申請比較,需要的朋友可以參考下
    2015-12-12
  • 詳解C語言如何執(zhí)行HTTP GET請求

    詳解C語言如何執(zhí)行HTTP GET請求

    在現(xiàn)代互聯(lián)網(wǎng)時代,網(wǎng)絡數(shù)據(jù)的獲取和分析變得越來越重要,本文我們將使用C語言和libcurl庫來編寫一個簡單的網(wǎng)絡爬蟲,以執(zhí)行HTTP GET請求并獲取淘寶網(wǎng)頁的內(nèi)容,感興趣的可以了解下
    2023-11-11
  • C++程序簡單示例

    C++程序簡單示例

    這篇文章主要給大家分享的是C++程序簡單示例,下面文章將圍繞C++程序的相關資料展開內(nèi)容,需要的朋友可以參考一下,希望對你有所幫助
    2021-11-11
  • C++ 輸入一行數(shù)字(含負數(shù))存入數(shù)組中的案例

    C++ 輸入一行數(shù)字(含負數(shù))存入數(shù)組中的案例

    這篇文章主要介紹了C++ 輸入一行數(shù)字(含負數(shù))存入數(shù)組中的案例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12

最新評論

谷城县| 泸水县| 芒康县| 会同县| 青铜峡市| 神池县| 万州区| 宁都县| 南平市| 成武县| 铜陵市| 涿鹿县| 苗栗县| 皮山县| 连州市| 德兴市| 屏南县| 平阳县| 彰武县| 尼玛县| 岳西县| 南郑县| 烟台市| 隆德县| 舒城县| 汾阳市| 丰顺县| 化隆| 晴隆县| 全椒县| 会宁县| 昌都县| 林口县| 英吉沙县| 泽普县| 连城县| 西城区| 常熟市| 阳东县| 清涧县| 通道|