程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> STL 之 vector 用法,stlvector用法

STL 之 vector 用法,stlvector用法

編輯:C++入門知識

STL 之 vector 用法,stlvector用法


 

一、頭文件 #include<vector>

二、常用方法:

// 在這個向量的尾部插入x的考貝,平均時間為常數,最壞時間為O(n);

1: void push_back(const T& x);

比如:vector<string> fruits;

fruits.pusb_back ("orange");

fruits.push_back("apples");

fruits.push_back("grapes");

fruits.pusb_back("apples");

那麼向量fruits現在包含了下列順序的項:"orange", "apples", "grapes",  "apples";

 

//前置條件:迭代器位於向量頭和向量尾後的下一個位子之間

//後置條件:X的拷貝放入迭代器所指的位置; 調用前,每個大於等於該位置下標的位置一次向後移動;返回位於新插入位置的迭代器;O(n);

2:  iterator insert(iterator position, const T& X);

假設迭代器 ite 位於小標為2的位置上,實行操作:vector<cstring>::iterator new_ite = fruits.insert(ite, "kiwi");後 fruits 向量變為如下:

"orange",  "apples",  "kiwi",  "grapes",  "apples";

迭代器 new_ite 位於下標為2 的“kiwi”上; 並且 ite 失效(即:ite 不再存在 或 不確定其位置);

 

//後置條件: 調用後向量尾部的項被刪除;

3: void pop_back();

實行操作:fruits.pop_back();後 向量 fruits 如下:"orange",  "apples",  "kiwi",  "grapes";

 

//前置條件:迭代器位於向量的某一項位置上;

//後置條件:這次調用前位於迭代器上的項被刪除; 調用後次迭代器下標後面的所有下標一次向前移動; O(n);

4:  void erase (iterator position);

如果迭代器 ite 位於項 “apples” 的位置,實行操作:fruits.erase(ite);後向量 fruits 如下:    "orange",  "kiwi",  "grapes";

迭代器 ite 失效(即:ite 不再存在 或 不確定其位置);

此外,void erase(iterator first, iterator last)還用一個擁有兩個迭代器參數的版本----first和last, 所有在first(包括first)和 last(不包括 last)之間的項將被刪除;

若我們假設 fruits 向量中有項:"orange",  "apples",  "kiwi",  "grapes"; 並且 first 位於“apples”, last 位於 “grapes”上;

執行操作:fruits.erase (first, last) 後向量 fruits 如下:"orange", “grapes";

同樣,迭代器 first 和 last 也要失效;

 

// 返回向量中項的 個數;

5: unsigned size ();

繼續接著 4 第一個erase() 後的操作執行:unsigned cnt = fruits.size(); 那麼 cnt 將是 3;

 

// 返回位於向量開頭的迭代器

6: iterator begin ();

執行操作: vector <cstring> :: iterator ite = fruits.being();

那麼迭代器 ite 位於 項 “orange” 上;

 

// 返回恰好位於位於向量最後一項的下一個位置,(注意不是在最後一個項的位置,而是其後)

7: iterator end();

執行操作:

vector <cstring>::iterator ite = fruits.end ();

fruits.insert(ite, "lemons");

向量fruits如下: "orange",  "kiwi",  "grapes",  "lemons";

 

// 返回向量開頭項的引用

8: T& front()

繼續執行: cout << fruits.front(); 那麼輸出的是:“orange”;

 

// 如果這個向量中不包含任何項,則返回 真, 否則返回假;

9: bool empty ();

 

// 清空向量中所有項

10: void clear ();

繼續執行操作: fruits.clear (); 則向量法 fruits 建為空

 

此外,對於數組的 [] 運算符 也完全使用與 vector  且方法完全一樣,這裡不再贅述;


C++中STL的vector容器的析構函數怎使用?

提供你一個辦法:
在文件 <vector>
中,下一個斷點
~vector()
{
}

看看會不會運行到,這樣,你就知道,你不必自己調用 ~vector(),系統會做的。
我的機器上,是第 386 行。

試試看
 

c++的STL容器中的end()具體機制是怎

STL中為我們提供的最重要的兩個內容是容器(vector,list等)和一系列的算法。在這些算法中有許多需要遍歷容器中的所有元素,如search,sort等算法。STL的設計者希望將算法和容器分離開來,一個算法可以幫不同的容器實現功能。為此目的,STL應用到了《設計模式》中提到的迭代器模式。
《設計模式》中將迭代器模式定義為:提供一種方法,使之能依序遍歷容器中的每個元素,而不需要暴露容器內部的信息。在面向對象的設計裡,實現迭代器,我們會為所有的迭代器提供一個統一的接口,然後更個容器的迭代器繼承這個接口,然後在使用處通過接口來實現對不同迭代器的調用。但STL是采用泛型思維,利用摸版來實現的類庫,所以它的迭代器的實現和面向對象稍有不同,但原理類似。在此將通過例子來具體看看STL中迭代器的實現。
我們先來看看find()函數的實現:
//摘自stl_algo.h
template<typename _InputIter, typename _Tp>
inline _InputIter
find(_InputIter __first, _InputIter __last,
const _Tp& __val,
input_iterator_tag)
{
while (__first != __last && !(*__first == __val))
++__first;
return __first;
}

find()函數的功能是在一個容器中查找一個元素,需要遍歷兩個迭代器對象_first和_last所在的區間。在此我們看到它對區間的遍歷是通過++__first來實現的。也就是說迭代器需要重載++運算符來實現對容器的遍歷。來具體看看vector和list中的迭代器實現。
我們知道vector中的元素是連續存放的,類似於數組,在數組中可以通過指針很容易的實現對數組的遍歷,在vector中也一樣,並不需要提供給它專門的迭代器類,通過指針就可以實現迭代器的功能。看看例子:
#include<iostream>
#include<vector>
using namespace std;

template<typename _InputIter, typename _Tp>
inline _InputIter
myfind(_InputIter __first, _InputIter __last,
const _Tp& __val)
{
while (__first != __last && !(*__first == __val))
++__first;
return __first;
}

int main()
{
vector<int> vec;

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

int *p0 = &vec[0];
int *p1 = &vec[10];

int *p2 = myfind(p0,p1,6);

if ( p2 != &vec[10])
cout << *p2 << endl;

system("pause");
return 0;
}
例子中,我對find......余下全文>>
 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved