国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

C++中的vector容器

這篇具有很好參考價值的文章主要介紹了C++中的vector容器。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報違法"按鈕提交疑問。

vector的介紹

??vector是封裝動態(tài)數(shù)組的順序容器。
??就像數(shù)組一樣,vector也采用的連續(xù)存儲空間來存儲元素。這也就意味著我們可以通過下標(biāo)來獲取vector的元素,和數(shù)組一樣高效。但是又不像數(shù)組,vector的大小是可以動態(tài)改變的,且它的大小會被容器自動處理。
??本質(zhì)上,vector使用動態(tài)分配數(shù)組來存儲它的元素。當(dāng)新元素插入時,這個數(shù)組需要被重新分配大小,分配一個新的數(shù)組,然后將全部元素轉(zhuǎn)移到這個數(shù)組。就時間而言,是一個代價相對較高的任務(wù),因?yàn)槊慨?dāng)一個新的元素加入容器時,vector并不分每次都重新分配大小。
??vector空間分配策略:vector會分配一些額外的空間以適應(yīng)可能的增長,因?yàn)榇鎯臻g比實(shí)際需要的存儲空間更大。不同的庫采用不同的策略權(quán)衡空間的使用和重新分配。但是無論如何,重新分配都應(yīng)該是對數(shù)增長的間隔大小,以至于在末尾插入一個元素的時候是在常數(shù)時間的復(fù)雜度完成的。因此,vector占用了更多的存儲空間,為了獲得管理存儲空間的能力,并且以一種有效的方式動態(tài)增長。
??與其他動態(tài)序列容器相比,vector在訪問元素的時候更加高效,在末尾添加和刪除元素相對高效。對于其它不在末尾的刪除和插入,效率更低。

vector的使用

vector的定義

構(gòu)造函數(shù)聲明 接口說明
vector() 無參構(gòu)造
vector(size_type n, const value_type& val = value_type()) 構(gòu)造并初始化n個val
vector(const vector& x) 拷貝構(gòu)造
vector(InputIterator first, InputIterator last, const allocator_type& alloc = allocator_type()) 用迭代器進(jìn)行初始化構(gòu)造
int main()
{
	vector<int> first;
	vector<int> second(4, 100);
	vector<int> third(second.begin(), second.end());
	vector<int> fourth(third);

	int myints[] = { 16, 2, 77, 29 };
	vector<int> fifth(myints, myints + sizeof(myints) / sizeof(int));

	cout << "The contents of fifth are:";
	for (vector<int>::iterator it = fifth.begin(); it != fifth.end(); ++it)
		cout << ' ' << *it;

	cout << '\n';

	return 0;
}

C++中的vector容器

vector初始化

初始化方法 說明
vector<T> v1 v1是一個空vector,它潛在的元素是T類型的,執(zhí)行默認(rèn)初始化
vector<T> v2(v1) v2中包含有v1所有元素
vector<T> v2 = v1 等價于v2(v1)
vector<T> v3(n, val) v3包含了n個重復(fù)的元素,每個元素的值都是val
vector<T> v4(n) v4包含了n個重復(fù)地執(zhí)行了初始化的對象
vector<T> v5(a,b,c…) v5包含了初始值個數(shù)的元素,每個元素被賦予響應(yīng)的初始值
vector<T> v5={a,b,c…} 等價于
int main()
{
	vector<int> v1;
	vector<string> v2;
	vector<vector<int>> v3;  //這里相當(dāng)于二維數(shù)組int a[n][n];
	vector<int> v4{ 1,2,3,4,5 };
	vector<int> v5 = { 1,2,3,4,5 }; //列表初始化,注意使用的是花括號
	vector<string> v6 = { "hi","my","name","is","lee" };
	vector<int> v7(5, -1); //初始化為-1,-1,-1,-1,-1。第一個參數(shù)是數(shù)目,第二個參數(shù)是要初始化的值
	vector<string> v8(3, "hi");
	vector<int> v9(10); //默認(rèn)初始化為0
	vector<int> v10(4); //默認(rèn)初始化為空字符串

	return 0;
}

vector iterator的使用

iterator的使用 接口說明
begin+end 獲取第一個數(shù)據(jù)位置的iterator/const_iterator,獲取最后一個數(shù)據(jù)的下一個位置的iterator/const_iterator
rbegin+rend 獲取最后一個數(shù)據(jù)位置的reverse_iterator,獲取第一個數(shù)據(jù)前一個位置的reverse_iterator
int main()
{
	vector<int> myvector{ 1, 2, 3, 4, 5 };
	cout << *myvector.begin() << endl;
	cout << *(myvector.end() - 1) << endl;
	cout << *myvector.rbegin() << endl;
	cout << *(myvector.rend() - 1) << endl;

	return 0;
}

C++中的vector容器

vector空間增長問題

容量空間 接口說明
size 獲取數(shù)據(jù)個數(shù)
capacity 獲取容量大小
empty 判斷是否為空
resize 改變vector的size
reserve 改變vector的capacity

??capacity的代碼在vs和g++下分別運(yùn)行會發(fā)現(xiàn),vs下capacity是按1.5倍增長的,g++是按2倍增長的。vector具體增長多少是根據(jù)具體的需求定義的。vs是PJ版本的STL,g++是SGI版本的STL;
??reserve只負(fù)責(zé)開辟空間,如果確定知道需要用多少空間,reserve可以緩解vector增容的代價缺陷問題;
??resize在開空間的同時還會進(jìn)行初始化,影響size。

int main()
{
	vector<int> myints;
	cout << "0.size:" << myints.size() << endl;

	for (int i = 0; i < 10; i++)
		myints.push_back(i);

	cout << "1.size:" << myints.size() << endl;

	myints.insert(myints.end(), 10, 100);
	cout << "2.size:" << myints.size() << endl;

	myints.pop_back();
	cout << "3.size:" << myints.size() << endl;

	return 0;
}

C++中的vector容器

int main()
{
	vector<int> myvector;

	for (int i = 0; i < 100; i++)
		myvector.push_back(i);

	cout << "size:" << (int)myvector.size() << endl;
	cout << "capacity:" << (int)myvector.capacity() << endl;
	cout << "max_size:" << (int)myvector.max_size() << endl;

	return 0;
}

C++中的vector容器

int main()
{
	vector<int> myvector;
	int sum(0);

	for (int i = 1; i <= 10; i++)
		myvector.push_back(i);

	while (!myvector.empty())
	{
		sum += myvector.back();
		myvector.pop_back();
	}

	cout << "total:" << sum << endl;

	return 0;
}

C++中的vector容器

int main()
{
	vector<int> myvector;

	for (int i = 1; i < 10; i++)
		myvector.push_back(i);

	cout << "0.size:" << myvector.size() << endl;
	myvector.resize(5);
	cout << "1.size:" << myvector.size() << endl;
	myvector.resize(8, 100);
	cout << "2.size:" << myvector.size() << endl;
	myvector.resize(12);
	cout << "3.size:" << myvector.size() << endl;

	cout << "myvector contains:";
	for (int i = 0; i < myvector.size(); i++)
		cout << ' ' << myvector[i];

	cout << endl;

	return 0;
}

C++中的vector容器

vector增刪改查

vector增刪改查 接口說明
push_back 尾插
pop_back 尾刪
find 查找(不是vector的成員接口)
insert 在position之前插入val
erase 刪除position位置的數(shù)據(jù)
swap 交換兩個vector的數(shù)據(jù)空間
operator[] 想數(shù)組一樣訪問
int main()
{
	vector<int> myvector;

	for (int i = 1; i <= 10; i++)
		myvector.push_back(i);

	for (int i = 0; i < myvector.size(); i++)
		cout << myvector[i] << ' ';
	cout << endl;

	for (int i = 0; i < 3; i++)
		myvector.pop_back();

	for (int i = 0; i < myvector.size(); i++)
		cout << myvector[i] << ' ';

	return 0;
}

C++中的vector容器

int main()
{
	vector<int> v;
	v.push_back(1);
	v.push_back(2);
	v.push_back(3);
	v.push_back(4);

	for (auto e : v)
	{
		cout << e << " ";
	}
	cout << endl;

	vector<int>::iterator pos = find(v.begin(), v.end(), 2);
	if (pos != v.end())
	{
		v.insert(pos, 20);
	}

	for (auto e : v)
	{
		cout << e << " ";
	}
	cout << endl;

	pos = find(v.begin(), v.end(), 2);
	if (pos != v.end())
	{
		v.erase(pos);
	}

	for (auto e : v)
	{
		cout << e << " ";
	}
	cout << endl;

	v.erase(v.begin());

	for (auto e : v)
	{
		cout << e << " ";
	}
	cout << endl;

	return 0;
}

C++中的vector容器

int main()
{
	vector<int> myvector;
	for (int i = 1; i <= 10; i++)
		myvector.push_back(i);
	//刪除指定位置數(shù)據(jù)
	myvector.erase(myvector.begin() + 5);
	//刪除指定一個位置,到另一個位置間的所有數(shù)據(jù)
	myvector.erase(myvector.begin(), myvector.begin() + 3);

	cout << "myvector contains:";
	for (unsigned i = 0; i < myvector.size(); i++)
		cout << ' ' << myvector[i];
	cout << endl;

	return 0;
}

C++中的vector容器

int main()
{
	vector<int> foo(3, 100);
	vector<int> bar(5, 200);

	foo.swap(bar);

	cout << "foo contains:";
	for (unsigned i = 0; i < foo.size(); i++)
		cout << ' ' << foo[i];
	cout << endl;

	cout << "bar contains:";
	for (unsigned i = 0; i < bar.size(); i++)
		cout << ' ' << bar[i];
	cout << endl;

	return 0;
}

C++中的vector容器

vector迭代器失效問題

??迭代器的主要作用就是讓算法能夠不用關(guān)心底層數(shù)據(jù)結(jié)構(gòu),其底層實(shí)際就是一個指針,或者是對指針進(jìn)行了封裝。因此迭代器失效,實(shí)際就是迭代器底層對應(yīng)的指針?biāo)赶虻目臻g被銷毀了,而使用一塊已經(jīng)被釋放的空間,造成的后果是程序崩潰。
對于vector可能會導(dǎo)致其迭代器失效的操作:文章來源地址http://www.zghlxwxcb.cn/news/detail-423111.html

  1. 會引起其底層空間改變的操作,都有可能是迭代器失效,比如:resize、reserve、insert、assign、push_back等;
  2. 指定位置元素的刪除操作–erase;
  3. 注意:Linux下,g++編譯器對迭代器失效的檢測并不是非常嚴(yán)格,處理也沒有vs下極端。

到了這里,關(guān)于C++中的vector容器的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【C++庖丁解?!縎TL之vector容器的介紹及使用 | vector迭代器的使用 | vector空間增長問題

    【C++庖丁解牛】STL之vector容器的介紹及使用 | vector迭代器的使用 | vector空間增長問題

    ??你好,我是 RO-BERRY ?? 致力于C、C++、數(shù)據(jù)結(jié)構(gòu)、TCP/IP、數(shù)據(jù)庫等等一系列知識 ??感謝你的陪伴與支持 ,故事既有了開頭,就要畫上一個完美的句號,讓我們一起加油 vector的文檔介紹 vector是表示可變大小數(shù)組的序列容器。 就像數(shù)組一樣,vector也采用的連續(xù)存儲空間來存

    2024年03月14日
    瀏覽(36)
  • 【C++ | 數(shù)據(jù)結(jié)構(gòu)】從哈希的概念 到封裝C++STL中的unordered系列容器

    【C++ | 數(shù)據(jù)結(jié)構(gòu)】從哈希的概念 到封裝C++STL中的unordered系列容器

    引入: 順序結(jié)構(gòu)以及平衡樹中,元素關(guān)鍵碼與其存儲位置之間沒有對應(yīng)的關(guān)系,因此在查找一個元素時,必須要經(jīng)過關(guān)鍵碼的多次比較。順序查找時間復(fù)雜度為O(N),平衡樹中為樹的高度,即O( l o g 2 N log_2 N l o g 2 ? N ),搜索的效率取決于搜索過程中元素的比較次數(shù)。 盡管平

    2024年01月22日
    瀏覽(27)
  • 2.3 Vector 動態(tài)數(shù)組(迭代器)

    2.3 Vector 動態(tài)數(shù)組(迭代器)

    C++數(shù)據(jù)結(jié)構(gòu)與算法 目錄 1 C++自學(xué)精簡教程 目錄(必讀) 2 VectorT 動態(tài)數(shù)組(模板語法) 1 熟悉迭代器設(shè)計(jì)模式; 2 實(shí)現(xiàn)數(shù)組的迭代器; 3 基于迭代器的容器遍歷; 迭代器語法介紹 對迭代器的詳細(xì)介紹參考 : 迭代器 iterator 范圍for循環(huán) 刪除容器的元素 remove erase 迭代器的能力 迭

    2024年02月10日
    瀏覽(18)
  • Vector<T> 動態(tài)數(shù)組(模板語法)

    Vector<T> 動態(tài)數(shù)組(模板語法)

    C++數(shù)據(jù)結(jié)構(gòu)與算法 目錄 1 C++自學(xué)精簡教程 目錄(必讀) 2 動態(tài)數(shù)組 Vector(難度1) 其中,2 是 1 中的一個作業(yè)。2 中詳細(xì)講解了動態(tài)數(shù)組實(shí)現(xiàn)的基本原理。 1 學(xué)會寫基本的C++類模板語法; 2 為以后熟練使用 STL 打下基礎(chǔ); 3 為更進(jìn)一步的閱讀和掌握更多的C++庫打下基礎(chǔ); 模板語

    2024年02月10日
    瀏覽(23)
  • C++數(shù)組的元素在內(nèi)存中的存儲介紹

    C++數(shù)組的元素在內(nèi)存中的存儲介紹

    關(guān)于C++數(shù)組基礎(chǔ)知識可見:https://blog.csdn.net/cnds123/article/details/108936055 一維數(shù)組可以看作是一個線性表(有序序列),每個元素按照順序排列在一起。例如a[5]: 二維數(shù)組可以看作是一個平面中的表格,每個元素在具體的行列位置上,每行是一個一維數(shù)組。例如a[3][4]: 三維數(shù)

    2024年02月13日
    瀏覽(16)
  • Vector容器的詳細(xì)介紹

    1.1 功能: ? -vector 數(shù)據(jù)結(jié)構(gòu)和數(shù)組非常相似,也稱單端數(shù)組 1.2 vector與普通數(shù)組區(qū)別: ? - 不同之處在于數(shù)組是靜態(tài)空間,而vector可以動態(tài)拓展 1.3 動態(tài)拓展: ? 并不是在原空間之后續(xù)接新空間,而是找更大的內(nèi)存空間,然后將原數(shù)據(jù)拷貝新空間,釋放原空間。 ? vector容

    2024年01月23日
    瀏覽(33)
  • Vector<T> 動態(tài)數(shù)組(隨機(jī)訪問迭代器)

    C++自學(xué)精簡教程 目錄(必讀) 這里的版本主要是使用模板實(shí)現(xiàn)、支持隨機(jī)訪問迭代器,支持std::sort等所有STL算法。(本文對隨機(jī)迭代器的支持參考了 復(fù)旦大學(xué) 大一公共基礎(chǔ)課C++語言的一次作業(yè)) 隨機(jī)訪問迭代器的實(shí)現(xiàn)主要是繼承std::iteratorstd::random_access_iterator_tag, T來實(shí)現(xiàn)的。 隨

    2024年02月10日
    瀏覽(18)
  • 2.2 Vector<T> 動態(tài)數(shù)組(模板語法)

    2.2 Vector<T> 動態(tài)數(shù)組(模板語法)

    C++數(shù)據(jù)結(jié)構(gòu)與算法 目錄 1 C++自學(xué)精簡教程 目錄(必讀) 2 動態(tài)數(shù)組 Vector(難度1) 其中,2 是 1 中的一個作業(yè)。2 中詳細(xì)講解了動態(tài)數(shù)組實(shí)現(xiàn)的基本原理。 1 學(xué)會寫基本的C++類模板語法; 2 為以后熟練使用 STL 打下基礎(chǔ); 3 為更進(jìn)一步的閱讀和掌握更多的C++庫打下基礎(chǔ); 模板語

    2024年02月10日
    瀏覽(15)
  • 【C++】vector容器初步模擬

    【C++】vector容器初步模擬

    送給大家一句話: 努力一點(diǎn),漂亮—點(diǎn),陽光一點(diǎn)。早晚有一天,你會驚艷了時光,既無人能替,又光芒萬丈。 今天我我來進(jìn)行vector的模擬實(shí)現(xiàn),先簡單的實(shí)現(xiàn)一下初步功能,使其對內(nèi)置類型可以適配。(大部分與string很類似) vector是表示 可變大小數(shù)組 的序列容器。 就像

    2024年04月08日
    瀏覽(17)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包