c++的vector容器

vector容器概念

  1. vector是表示可變大小數組的序列容器。
  2. 就像數組一樣,vector也采用的連續存儲空間來存儲元素。也就是意味著可以采用下標對vector的元素 進行訪問,和數組一樣高效。但是又不像數組,它的大小是可以動態改變的,而且它的大小會被容器自 動處理。
  3. 本質講,vector使用動態分配數組來存儲它的元素。當新元素插入時候,這個數組需要被重新分配大小 為了增加存儲空間。其做法是,分配一個新的數組,然后將全部元素移到這個數組。就時間而言,這是 一個相對代價高的任務,因為每當一個新的元素加入到容器的時候,vector并不會每次都重新分配大 小。
  4. vector分配空間策略:vector會分配一些額外的空間以適應可能的增長,因為存儲空間比實際需要的存 儲空間更大。不同的庫采用不同的策略權衡空間的使用和重新分配。但是無論如何,重新分配都應該是 對數增長的間隔大小,以至于在末尾插入一個元素的時候是在常數時間的復雜度完成的。
  5. 因此,vector占用了更多的存儲空間,為了獲得管理存儲空間的能力,并且以一種有效的方式動態增 長。
  6. 與其它動態序列容器相比(deques, lists and forward_lists), vector在訪問元素的時候更加高效,在 末尾添加和刪除元素相對高效。對于其它不在末尾的刪除和插入操作,效率更低。比起lists和 forward_lists統一的迭代器和引用更好。

在這里插入圖片描述

vector容器注意事項

所謂動態增加大小,并不是再原空間之后續新空間(因為無法保證原空間之后尚有可配置的空間),而是一塊更大的內存空間,然后將原數據拷貝空間,并釋放原空間。因此,對vector的任何操作,一旦引起空間的重新配置,指向vector所有迭代器就都失效了。

vector構造函數

在這里插入圖片描述

vector賦值操作

在這里插入圖片描述

vector大小操作

在這里插入圖片描述

vector數據存取操作

在這里插入圖片描述

vector插入和刪除操作

在這里插入圖片描述

#include<iostream>
#include<vector>
#include<string>
#include<list>
using namespace std;void test01()
{vector<int>v;for (int i = 0; i < 10; i++){v.push_back(i);cout << v.capacity() << endl;//v.capacity()容器的容量}}/**/void printVector(vector<int>&v)
{for (vector<int>::iterator it = v.begin(); it != v.end(); it++){cout << *it << " ";}cout << endl;}void test02()
{vector<int >v;int arr[] = { 2, 3, 4, 1, 9 };vector<int>v1(arr, arr + sizeof(arr) / sizeof(int));vector<int >v2(v1.begin(), v1.end());printVector(v2);vector<int>v3(10, 100);printVector(v3);//賦值使用vector<int>v4;v4.assign(v3.begin(), v3.end());printVector(v4);v4.swap(v2);cout << "交換后的v4" << endl;printVector(v4);cout << "v4容器的大小" << v4.size() << endl;if (v4.empty()){cout << "v4空" << endl;}else{cout << "v4不空" << endl;}///v4  23419v4.resize(10,-1);//第二個參數是默認值,默認0printVector(v4);v4.resize(3);printVector(v4);
}//巧用swap收縮空間
void test03()
{vector<int >v;for (int i = 0; i < 100000; i++){v.push_back(i);}cout << "v的容量" << v.capacity() << endl;cout << "v的大小" << v.size() << endl;v.resize(3);cout << "v的容量" << v.capacity() << endl;cout << "v的大小" << v.size() << endl;//巧用swapvector<int>(v).swap(v);cout << "v的容量" << v.capacity() << endl;cout << "v的大小" << v.size() << endl;}
//reserve(int len).//容器預留len個元素長度,預留位置不初始化,元素不可訪問void test04()
{vector<int>v;v.reserve(100000);//預留出空間int *p = NULL;int num = 0;for (int i = 0; i < 100000; i++){v.push_back(i);if (p != &v[0]){p = &v[0];num++;}}cout << num << endl;//開辟100000數據用了多少次
}void test05()
{vector<int >v;v.push_back(10);v.push_back(20);v.push_back(30);v.push_back(50);cout << "v的front" << v.front() << endl;cout << "v的front" << v.back() << endl;v.insert(v.begin(), 2,100);//參數1 迭代器 參數2 個數n 參數3 具體插入的內容printVector(v);v.pop_back();//尾刪printVector(v);v.erase(v.begin());//刪除printVector(v);//v.erase(v.begin(), v.end());v.clear();//清空所有數據if (v.empty()){cout << "為空" << endl;}}void test06()
{//逆序遍歷vector<int>v;for (int i = 0; i < 10; i++){v.push_back(i);}printVector(v);//reverse_iterator  逆序的迭代器for (vector<int>::reverse_iterator it = v.rbegin(); it != v.rend(); it++){cout << *it << " ";}cout << endl;//vector迭代器是隨機訪問的迭代器 支持跳躍式訪問vector<int>::iterator itBegin = v.begin();itBegin = itBegin + 3;//如果上述寫法不報錯,這個迭代器是隨機訪問迭代器list<int>l;for (int i = 0; i < 10; i++){l.push_back(i);}list<int>::iterator lIt = l.begin();//lIt = lIt + 1;//不支持隨機訪問}int main()
{//test01();//test02();//test03();//test04();//test05();test06();system("pause");return 0;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/383277.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/383277.shtml
英文地址,請注明出處:http://en.pswp.cn/news/383277.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

嵌入式Linux下3G USB Modem的使用

busybox中需打開&#xff1a;wc&#xff0c;pidof&#xff1b; busybox中shell下打開getopts 百度搜索“Serial connection established. using channel 1”包含大量問題解答 2013-12-22 0個評論 收藏 我要投稿 一.ARM-Linux ARM-Linux-2.6.17 3G USB Modem:hu…

新一代數據庫技術

新一代非關系型數據庫有以下5個主要類型&#xff1a; 面向文件存儲&#xff1a;適用于存儲海量文件&#xff0c;代表產品MongoDb 列存儲(wide column store/column-family)數據庫&#xff1a;快速查找相關數據&#xff0c;相關數據被放在同一列中&#xff0c;代表產品Cassandra…

c++中stack容器

Stack 簡介 stack 是堆棧容器&#xff0c;是一種“先進后出”的容器。stack 是簡單地裝飾 deque 容器而成為另外的一種容器。#include stack沒有迭代器 Stack所有元素的進出都必須符合“先進后出”的條件&#xff0c;只有stack頂端的元素&#xff0c;才有機會被外界取用&am…

詳解udev

如果你使用Linux比較長時間了&#xff0c;那你就知道&#xff0c;在對待設備文件這塊&#xff0c;Linux改變了幾次策略。在Linux早期&#xff0c;設備文件僅僅是是一些帶有適當的屬性集的普通文件&#xff0c;它由mknod命令創建&#xff0c;文件存放在/dev目錄下。后來&#xf…

c++中的queue容器

queue容器 隊列是一種容器適配器&#xff0c;專門用于在FIFO上下文(先進先出)中操作&#xff0c;其中從容器一端插入元素&#xff0c;另一端 提取元素。 隊列作為容器適配器實現&#xff0c;容器適配器即將特定容器類封裝作為其底層容器類&#xff0c;queue提供一組特定的 成員…

NAU8810相關問題

1.ADC和DAC有什么區別&#xff1f; 不&#xff0c;這不是一個“愚弄人的”問題或腦筋急轉彎&#xff0c;并且我認為我們的讀者都非常清楚模數轉換器(ADC)及數模轉換器(DAC)的基本功能。 但在如何使用這些轉換器以及人們的認知度上也存在著哲理性區別。用最簡單的話講&#xff0…

c++中list容器

list概念 list是可以在常數范圍內在任意位置進行插入和刪除的序列式容器&#xff0c;并且該容器可以前后雙向迭代。list的底層是雙向鏈表結構&#xff0c;雙向鏈表中每個元素存儲在互不相關的獨立節點中&#xff0c;在節點中通過指針指向 其前一個元素和后一個元素。list與for…

Linux中rc的含義

在Linux中&#xff0c;最為常用的縮略語也許是“rc”&#xff0c;它是“runcomm”的縮寫――即名詞“run command”(運行命令)的簡寫。rc”是任何腳本類文件的后綴&#xff0c;這些腳本通常在程序的啟動階段被調用&#xff0c;通常是Linux系統啟動時。如/etc/rc&#xff08;連接…

c++中的set容器和multiset容器

set容器基本概念 set的特性是&#xff0c;所有元素都會根據元素的鍵值自動被排序。set的元素不像map那樣可以同時擁有實值和鍵值&#xff0c;set的元素即是鍵值又是實值。set不允許兩個元素又相同的鍵值。我們不可以通過set的迭代器改變set元素的值&#xff0c;因為set元素值就…

linux下的僵尸進程處理SIGCHLD信號

什么是僵尸進程&#xff1f; 首先內核會釋放終止進程(調用了exit系統調用)所使用的所有存儲區&#xff0c;關閉所有打開的文件等&#xff0c;但內核為每一個終止子進程保存了一定量的信息。這些信息至少包括進程ID&#xff0c;進程的終止狀態&#xff0c;以及該進程使用的CPU時…

c++中的map容器

map/multimap基本概念 Map的特性是&#xff0c;所有元素都會根據元素的鍵值自動排序。Map所有的元素都是pair&#xff0c;同時擁有實值和鍵值&#xff0c;pair的第一元素被視為鍵值&#xff0c;第二元素被視為實值&#xff0c;map不允許兩個元素有相同的鍵值我們可以通過map的…

mknod指令詳解

mknod - make block or character special files mknod [OPTION]... NAME TYPE [MAJOR MINOR] option 有用的就是 -m 了 name 自定義 type 有 b 和 c 還有 p 主設備號 次設備號 主設備號是由linux/major.h定義的&#xff0c;如下定義了一個DOC設備&am…

c++中容器(STL)的共性與使用的時機

容器的共通能力 C模板是容器的概念 理論提高&#xff1a;所有容器提供的都是值&#xff08;value&#xff09;語意&#xff0c;而非引用&#xff08;reference&#xff09;語意。容器執 行插入元素的操作時&#xff0c;內部實施拷貝動作。所以 STL 容器內存儲的元素必須能夠被…

Qt Creator 窗體控件自適應窗口大小布局

常見的軟件窗口大小改變&#xff08;最大化、手動改變時&#xff09;需要窗口的部件能夠自適應布局&#xff0c;而在Qt的應用程序界面設計中&#xff0c;對于像我一樣的初學者如何實現窗口自適應調整還是要繞點彎路的。網上百度了很多&#xff0c;多數說的很含糊&#xff0c;還…

c++中利用STL實現公司員工分組問題

#include<iostream>using namespace std; #include<vector> #include<string> #include<map> #include<ctime> /* 公司招聘了5個員工&#xff0c;5名員工進入公司之后&#xff0c;需要指派員工在那個部門工作 的人員信息&#xff1a;姓名 年齡 電…

c++中STL的常用算法--1(函數對象,謂詞,內建函數對象)

函數對象 重載函數調用操作符的類&#xff0c;其對象常稱為函數對象&#xff08;function object&#xff09;&#xff0c;即它們是行為類似函數的對象&#xff0c;也叫仿函數&#xff08;functor&#xff09;&#xff0c;其實就是重載"()"操作符&#xff0c;使得類…

QT子線程與主線程的信號槽通信

最近用QT做一個服務器&#xff0c;眾所周知&#xff0c;QT的主線程必須保持暢通&#xff0c;才能刷新UI。所以&#xff0c;網絡通信端采用新開線程的方式。在涉及到使用子線程更新Ui上的控件時遇到了點兒麻煩。網上提供了很多同一線程不同類間采用信號槽通信的方式&#xff0c;…

ubuntu14.04 通過PPA 安裝ffmpeg

去ffmpeg的官網可以獲取到最新的PPA信息 http://www.ffmpeg.org/download.html 根據系統選擇對應的PPA 然后執行以下語句&#xff1a; sudo add-apt-repository ppa:mc3man/trusty-media sudo apt-get updatesudo apt-get install ffmpeg 如果在安裝過程中發生了錯誤&#…

c++中的函數適配器

函數適配器 函數適配器概念 STL中定義了大量的函數對象&#xff0c;但是有時候需要對函數返回值進行進一步的簡單計算&#xff0c;或者填上多余的參數&#xff0c;不能直接代入算法&#xff0c;函數適配器實現了這一功能&#xff0c;將一種函數對象轉化為另一種符合要求的函數…