vector隨機訪問
㈠ c++里vector怎麼用
vector 一般把它叫做動態數組,但是其實它是一個順序容器,能夠在尾部高效的插入和刪除數值,同時支持隨機訪問其中的值,也就是說vector重載了[]運算符。但是不支持在前端進行同樣的操作,而deque支持在兩端完成同樣的操作。在C++中凡是使用數組的地方,都可以使用vector。它的一個最大特點是可以動態的增加大小,無需程序員關心,你可以使用push_back(),往對象裡面插入數據。下面是他的一些成員函數的測試!
#include<iostream>
#include<vector>
/*******主要是測試一下vector的各個
成員函數的用法。
********/
using namespace std;
int main()
{
vector<int> v;
vector<int> w;
int n;
while(cin>>n)
v.push_back(n);//在其尾部添加值
cout<< v.at(1)<<endl;//相當於[]運算符,數組從零開始計數s
(v.begin(),v.end(),ostream_iterator<int>(cout," "));
cout<<endl;
v.erase(v.begin());//刪除指定位置上的元素,參數為迭代器。此函數重載了,可以指定一個范圍或者是一個位置
v.erase(v.begin(),v.begin()+3);//同樣是左閉右開區間
(v.begin(),v.end(),ostream_iterator<int>(cout," "));
cout<<endl;
int a[]={12,11,32};
/*
insert()也進行了重載,如下面的
例子所示:
*/
v.insert(v.begin(),9);//表示在指定迭代器位置的前面插入一個值
v.insert(v.begin(),2,10);//表示在指定迭代起位置的前面插入若干個值,本例子為插入2個10
v.insert(v.begin(),a,a+3);//在指定迭代器位置的前面插入一個范圍的數值,同樣是左閉右開區間
(v.begin(),v.end(),ostream_iterator<int>(cout," "));
cout<<endl;
v.reserve(4);//這個函數畢神有什麼用手畢虧處?還待測試
v.swap(w);//更另外的一個vector的數據交換
(v.begin(),v.end(),ostream_iterator<數掘int>(cout," "));
cout<<endl;
(w.begin(),w.end(),ostream_iterator<int>(cout," "));
(v.rbegin(),v.rend(),ostream_iterator<int>(cout," "));
return 0;
}
㈡ C++如何隨機訪問vector容器元素
此處的隨機是什麼意思,如果是直接訪問可以用[]運算符,還有一個at()方法也是訪問元素的,at比[]更安全,因為越界會出錯。
如果是其中任意一個數的話,用stdlib.h中的rand函數,vector.at(rand())%3)這樣就行了,但是記住開始要用srand函數初始化!
㈢ vector和list的用法區別
vector與list區別
vector為存儲的對象分配一塊連續的地址空間,因此對vector中的元素隨機訪問效率很高。在vecotor中插入或者刪除某個元素,需要將現有元素進行復制,移動。如果vector中存儲的對象很大,或者構造函數復雜,則在對現有元素進行拷貝時開銷較大,因為拷貝對象要調用拷貝構造函數。對於簡單的小對象,vector的效率優於list。vector在每次擴張容量的時候,將容量擴展2倍,這樣對於小對象來說,效率是很高的。
list中的對象是離散存儲的,隨機訪問某個元素需要遍歷list。在list中插入元素,尤其是在首尾插入元素,效率很高,只需要改變元素的指針。
綜上所述:
vector適用:對象數量變化少,簡單對象,隨機訪問元素頻繁
list適用:對象數量變化大,對象復雜,插入和刪除頻繁
最大的區別是,list是雙向的,而vector是單向的。
因此在實際使用時,如何選擇這三個容器中哪一個,應根據你的需要而定,一般應遵循下面
的原則:
1、如果你需要高效的隨即存取,而不在乎插入和刪除的效率,使用vector
2、如果你需要大量的插入和刪除,而不關心隨即存取,則應使用list
3、如果你需要隨即存取,而且關心兩端數據的插入和刪除,則應使用deque。
vector
表示一段連續的內存區域,每個元素被順序存儲在這段內存中,對vector 的隨機訪問效率很高,但對非末尾元素的插入和刪除則效率非常低。
deque
也表示一段連續的內存區域,但與vector不同的是它支持高效地在其首部插入和刪除元素,它通過兩級數組結構來實現,一級表示實際的容器,第二級指向容器的首和尾
list
表示非連續的內存區域並通過一對指向首尾元素的指針雙向鏈接起來,插入刪除效率高,隨機訪問效率低
2,stl提供了三個最基本的容器:vector,list,deque。
vector和built-in數組類似,它擁有一段連續的內存空間,並且起始地址不變,因此
它能非常好的支持隨即存取,即[]操作符,但由於它的內存空間是連續的,所以在中間
進行插入和刪除會造成內存塊的拷貝,另外,當該數組後的內存空間不夠時,需要重新
申請一塊足夠大的內存並進行內存的拷貝。這些都大大影響了vector的效率。
list就是數據結構中的雙向鏈表(根據sgi
stl源代碼),因此它的內存空間可以是不連續
的,通過指針來進行數據的訪問,這個特點使得它的隨即存取變的非常沒有效率,因此它
沒有提供[]操作符的重載。但由於鏈表的特點,它可以以很好的效率支持任意地方的刪除
和插入。
deque是一個double-ended queue,它的具體實現不太清楚,但知道它具有以下兩個特點:
它支持[]操作符,也就是支持隨即存取,並且和vector的效率相差無幾,它支持在兩端的
操作:push_back,push_front,pop_back,pop_front等,並且在兩端操作上與list的效率
也差不多。
因此在實際使用時,如何選擇這三個容器中哪一個,應根據你的需要而定,一般應遵循下面
的原則:
1、如果你需要高效的隨即存取,而不在乎插入和刪除的效率,使用vector
2、如果你需要大量的插入和刪除,而不關心隨即存取,則應使用list
3、如果你需要隨即存取,而且關心兩端數據的插入和刪除,則應使用deque。
㈣ vector中元素在內存中是連續存儲的嗎如果是string類型的元素呢
vector中的元素在內存中確實是連續存儲的. vector的實現是由一個動態數組構成. 當空間不夠的時候, 採用類似於C語言的realloc函數重新分配空間. 正是因為vector中的元素是連續存儲的, 所以vector支持常數時間內完成元素的隨機訪問. vector中的iterator屬於Random Access Iterator.
如果vector儲存的是string類型. 情況也是一樣的. 值得注意的是, string類型並不是簡單的char 數組. string中的數組其實也是動態分配的. 為了方便, 你可以這樣理解(不完全正確), 當vector中存儲string類型時, 其實是數組中存著許多char *類型的指針, 每個指針指向的內容才是string的字元內容. 可以給你一個簡單的圖示
+----+----+----+----+----+----+
vector | * | * | * | * | | |
+-- |-+--|---- |---- |-------------+
| | | |
v v v v
s1 s2 s3 s4
至於你說的強制類型轉換做內存拷貝, 我不太明白你想表達的意思, 所以這點我不知如何說起.
㈤ STL中vector,list,deque和map的區別
1 vector
向量 相當於一個數組
在內存中分配一塊連續的內存空間進行存儲。支持不指定vector大小的存儲。STL內部實現時,首先分配一個非常大的內存空間預備進行存儲,即capacituy()函數返回的大小,當超過此分配的空間時再整體重新放分配一塊內存存儲,這給人以vector可以不指定vector即一個連續內存的大小的感覺。通常此默認的內存分配能完成大部分情況下的存儲。
優點:(1) 不指定一衡物埋塊內存大小的數組的連續存儲,即可以像數組一樣操作,但可以對此數組
進行動態操作。通常體現在push_back() pop_back()
(2) 隨機訪問方便,即支持[ ]操作符和vector.at()
(3) 節省空間。
缺點:(1) 在內部進行插入刪除操作效率低。
(2) 只能在vector的最後進行push和pop,不能在vector的頭進行push和pop。
(3) 當動態添加的數據超過vector默認分配的大小時要進行整體的咐螞重新分配、拷貝與釋
放
2 list
雙向鏈表
每一個結點都包括一個信息快Info、一個前驅指針Pre、一個後驅指針Post。可以不分配必須的內存大小方便的進行添加和刪除操作。使用的是非連續的內存空間進行存螞激儲。
優點:(1) 不使用連續內存完成動態操作。
(2) 在內部方便的進行插入和刪除操作
(3) 可在兩端進行push、pop
缺點:(1) 不能進行內部的隨機訪問,即不支持[ ]操作符和vector.at()
(2) 相對於verctor佔用內存多
3 deque
雙端隊列 double-end queue
deque是在功能上合並了vector和list。
優點:(1) 隨機訪問方便,即支持[ ]操作符和vector.at()
(2) 在內部方便的進行插入和刪除操作
(3) 可在兩端進行push、pop
缺點:(1) 佔用內存多
使用區別:
1 如果你需要高效的隨即存取,而不在乎插入和刪除的效率,使用vector
2 如果你需要大量的插入和刪除,而不關心隨即存取,則應使用list
3 如果你需要隨即存取,而且關心兩端數據的插入和刪除,則應使用deque
㈥ C++中可以隨機訪問vector中的值嗎
可以的,就像數組帆巧一樣訪問就可以了。
下標訪問
vector[位置],但是不會檢測位笑肆置的合理性
後者at訪問vector.at(位置),碰轎轎進行位置合理性檢測
㈦ STL中vector,list,deque和map的區別
在STL中基本容器有: string、vector、list、deque、set、map
set 和map都是無序的保存元素,只能通過它提供的介面對裡面的元素進行訪問
set:集合,
用來判斷某一個元素是不是在一個組裡面,使用的比較少
map:映射,相當於字典,把一個值映射成另一個值,如果想創建字典的話使用它好了
底層採用的是樹型結構,多數使用平衡二叉樹實現,查找某一值是常數時間,遍歷起來效果也不錯,
只是每次插入值的時候,會重新構成底層的平衡二叉樹,效率有一定影響.
string、vector、list、deque、set 是有序容器
1.string
string 是basic_string 的實現,在內存中是連續存放的.為了提高效率,都會有保留內存,如string s=
"abcd",這時s使用的空間可能就是255,
當string再次往s裡面添加內容時不會再次分配內存.直到內容>255時才會再次申請內存,因此提高了它的性能.
當內容>255時,string會先分配一個新內存,然後再把內容復制過去,再復制先前的內容.
對string的操作,如果是添加到最後時,一般不需要分配內存,所以性能最快;
如果是對中間或是開始部分操作,如往那裡添加元素或是刪除元素,或是代替元素,這時需要進行內存復制,性能會降低.
如果刪除元素,string一般不會釋放它已經分配的內存,為了是下次使用時可以更高效.
由於string會有預保留內存,所以如果伍尺大量使用的話,會有內存浪費,這點需要考慮.還有就是刪除元素時不釋放過多的內存,這也要考慮.
string中內存是在堆中分配的,所以串的長度可以很大,而char[]是在棧中分配的,長度受到可使用的最大棧長度限制.
如果對知道要使用的字元串的最大長度,那麼可以使用普通的char[],實現而不必使用string.
string用在串長度不可知的情況或是變化很大的情況.
如果string已經經歷了多次添加刪除,現在的尺寸比最大的尺寸要小很多,想減少string使用的大小,可以使用:
string s =
"abcdefg";
string y(s); // 因為再次分配內存時,y只會分配與s中內容大一點的內存,所以浪費不會很大
s.swap(y);
// 減少s使用的內存
如果內存夠多的話就不用考慮這個了
capacity是查看現在使用內存的函數
大家可以試試看string分配一個一串後的capacity返回值,還有其它操作後的返回值
2.vector
vector就是動態數組.它梁昌也是在堆中分配內存,元素連續存放,有保留內存,如果減少大小後內存也不會釋放.如果新值>當前大小時才會再分配內存.
它擁有一段連續的內存空間,並且起始地址不變,因此它能非常好的支持隨即存取,即[]操作符,但由於它的內存空間是連續的,所以在中間進行插入和刪除會造成內存塊的拷貝,另外,當該數組後的內存空間不夠時,需要重新申請一塊足夠大的內存並進行內存的拷貝。這些都大大影響了vector的效率。
對最後元素操作最快(在後面添加刪除最快 ),
此時一般不需要移動內存,只有保留內存不夠時才需要
對中間和開始處進行添加刪除元素操作需要移動內存,如果你的元素是結構或是類,那麼移動的同時還會進行構造和析構操作,所以性能不高
(最好將結構或類的指針放入vector中,而不是結構或類本身,這樣可以避免移動時的構造與析構)。
訪問方面,對任何元素的訪問都是O(1),也就是是常數的,所以vector常用來保存需要經常進行隨機訪問的內容,並且不需要經常對中間元素進行添加刪除操作.
相比較可以看到vector的屬性與string差不多,同樣可以使用capacity看當前保留的內存,使用swap來減少它使用的內存.
總結
需要經常隨機訪問請用vector
3.list
list就是雙向鏈表,元素也是在堆中存放,每個元素都是放在一塊內存中,它的內存空間可以是不連續的,通過指針來進行數據的訪問,這個特點使得它的隨即存取變的非常沒有效率,因此它沒有提供[]操作符的重載。但由於鏈表的特點,它可以以很好的效率支持任意地方的刪除和插入。
list沒有空間預留習慣,所以每分配一個元素都會從內存中分配,每刪除腔渣高一個元素都會釋放它佔用的內存.
list在哪裡添加刪除元素性能都很高,不需要移動內存,當然也不需要對每個元素都進行構造與析構了,所以常用來做隨機操作容器.
但是訪問list裡面的元素時就開始和最後訪問最快
訪問其它元素都是O(n)
,所以如果需要經常隨機訪問的話,還是使用其它的好
總結
如果你喜歡經常添加刪除大對象的話,那麼請使用list
要保存的對象不大,構造與析構操作不復雜,那麼可以使用vector代替
list完全是性能最低的做法,這種情況下還是使用vector好,因為指針沒有構造與析構,也不佔用很大內存
4.deque
deque是一個雙端隊列(double-ended
queue),也是在堆中保存內容的.它的保存形式如下:
[堆1]
...
[堆2]
...
[堆3]
每個堆保存好幾個元素,然後堆和堆之間有指針指向,看起來像是list和vector的結合品,不過確實也是如此
deque可以讓你在前面快速地添加刪除元素,或是在後面快速地添加刪除元素,然後還可以有比較高的隨機訪問速度
它支持[]操作符,也就是支持隨即存取,可以讓你在前面快速地添加刪除元素,或是在後面快速地添加刪除元素,然後還可以有比較高的隨機訪問速度,和vector的效率相差無幾,它支持在兩端的操作:push_back,push_front,pop_back,pop_front等,並且在兩端操作上與list的效率也差不多。
在標准庫中vector和deque提供幾乎相同的介面,在結構上它們的區別主要在於這兩種容器在組織內存上不一樣,deque是按頁或塊來分配存儲器的,每頁包含固定數目的元素.相反vector分配一段連續的內存,vector只是在序列的尾段插入元素時才有效率,而deque的分頁組織方式即使在容器的前端也可以提供常數時間的insert和erase操作,而且在體積增長方面也比vector更具有效率
總結:
vector是可以快速地在最後添加刪除元素,並可以快速地訪問任意元素
list是可以快速地在所有地方添加刪除元素,但是只能快速地訪問最開始與最後的元素
deque在開始和最後添加元素都一樣快,並提供了隨機訪問方法,像vector一樣使用[]訪問任意元素,但是隨機訪問速度比不上vector快,因為它要內部處理堆跳轉
deque也有保留空間.另外,由於deque不要求連續空間,所以可以保存的元素比vector更大,這點也要注意一下.還有就是在前面和後面添加元素時都不需要移動其它塊的元素,所以性能也很高。
因此在實際使用時,如何選擇這三個容器中哪一個,應根據你的需要而定,一般應遵循下面
的原則:
1、如果你需要高效的隨即存取,而不在乎插入和刪除的效率,使用vector
2、如果你需要大量的插入和刪除,而不關心隨即存取,則應使用list
3、如果你需要隨即存取,而且關心兩端數據的插入和刪除,則應使用deque。
㈧ C++中支持隨機訪問的容器有哪些
stl容器包含順序容器和關聯容器。關聯容器主要有vector,list,deque,關聯容器主要是pair、set、map、multiset和multimap,所以總共算是7種。
所謂隨機訪問,我的理解是按照數組的方式在內存中順序存放,只需要根據首地址和相應下標就能定址到相應的元素。
所以逐個分析如下:
vector的實現原理是數組,所以支持隨機訪問。
list的實現原理是雙向鏈表,所以不支持。
deque的實現原理是類似數組的雙端隊列,支持隨機訪問。
pair是個二元組,一共就兩個值,談不上隨機訪問。
set、multiset、map、multimap的實現原理是紅黑樹,不支持隨機訪問。
所以在上述七種容器中只有vector和deque兩種是支持隨機訪問的。
㈨ c++中vector元素的地址是不連續的
vector中的元素在內存中是連續存儲的.
vector的實現是由一個動態數組構成. 當空間不夠的時候, 採用類似於C語言的realloc函數重新分配空間. 正是因為vector中的罩坦元素是連續存儲的, 所以vector支持常數時拆悶世間內完成元素的隨機訪問. vector中的iterator屬旅肢於Random Access Iterator.