C++ vector迭代器的用法 學習筆記
STL標準模板庫提供三種類型的元件:容器,迭代器和演算法,他們都支援泛型程式設計標準;
容器主要分為兩大類:順序容器和關聯容器。順序容器有:(vector, list, deque和string等)是一系列元素的有序集合。關聯容器:(set, multiset,map, multimap)包含查詢元素的鍵值;
迭代器的作用是遍歷容器;
在進行多組測試資料是一定要注意:在每組測試之後都要清空,否則容器會保留上一次測試的資料;(例最下)
Vector 使用 I:
#include <iostream>
#include <vector> //向量需要;
#include <cstdio>
#include <numeric> //accumulate演算法需要;
using namespace std;
int a[10005];
int main()
{
vector <int> v; //定義向量v;
vector<int>::iterator it; //定義迭代器it;
int n;
while(~scanf("%d", &n))
{
for(int i=0; i<n; i++) { //賦值;
scanf("%d", &a[i]);
v.push_back(a[i]);
}
for(it=v.begin(); it!=v.end(); it++) {//使用iterator迭代器順序遍歷所有元素;
printf("%d ", *it); //輸出迭代器當前位置上的元素值;
}
printf("\n");
printf("%d\n",accumulate(v.begin(), v.end(), 0)); //統計並輸出向量所有元素的和;
}
return 0;
}
實現斐波那契數列:
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector <unsigned int> v;
unsigned int n;
v.push_back(0);
v.push_back(1);
for(int i=2; i<50; i++) {
v.push_back(v[i-1]+v[i-2]);
}
while(cin >> n) {
cout << v[n] << endl;
}
return 0;
}
//ZOJ 1179
#include <iostream>
#include <cstdio>
#include <numeric>
#include <vector>
using namespace std;
int main()
{
vector <double> v;
int n;
while(~scanf("%d", &n)) {
double m;
v.clear();
for(int i=0; i<n; i++) {
scanf("%lf", &m);
v.push_back(m);
}
double sum =(double)accumulate(v.begin(), v.end(), 0)/n;
printf("%.3lf\n", sum);
}
return 0;
}
***建立vector物件***
vector 向量容器不但能像陣列一樣對元素進行隨機訪問,還能在尾部插入元素,是一種簡單,高效的容器,完全可以代替陣列;
值得注意的是, vector容器具有自動管理的功能,對於元素的插入和刪除,可動態調整所佔的記憶體空間;使用vector向量容器,需要包含標頭檔案#include<vector>;
vector容器的下表是從0開始計數的,也就是說,如果vector容器的大小是n, 那麼元素的下表是從0~ n-1;對於vector容器的容量定義,可以實現定義一個固定的大小,事後,可以隨時調整大小,也可以事先不定義,隨時使用push_back()方法從尾部擴張元素,也可以使用insert()在某個元素位置前插入新元素;
vector容器有兩種重要的方法,begin() 和 end() 。begin()返回的是首元素位置的迭代器;end()返回的是最後一個元素的下一元素位置的迭代器;
***建立vector物件***
有三種形式:
(1). 不指定容器的元素個數,如定義一個用來儲存整型的容器:
vector <int> v;
(2). 建立時,指定容器的大小,如定義一個用來儲存10個double型別元素的向量容器:
vector <int> v(10); //注意:元素的下標為0~9, 另外每個元素具有指定的初始值;
(3). 建立一個具有n個元素的向量容器物件,每個元素具有指定的初始值;
vector <double> v(10, 8.6); //定義了一個具有10個元素的向量容器,每個元素的值是8.6;
***尾部元素擴張***
***使用push_back()在尾部追加元素***// 也就是尾部元素擴張
尾部追加元素,vector容器會自動分配新記憶體空間。對空的vector物件擴張,也可對已有元素的vector物件擴張;
例:將2,7,9三個元素從尾部新增到v容器中,這樣,v容器中就有三個元素2,7,9;
#include<iostream>
#include<vector>
using namespace std;
int main(int argc,char *argv[])
{
vector<int>v;
v.push_back(2);
v.push_back(7);
v.push_back(9);
return 0;
}
***下標方式訪問vector元素***
訪問或遍歷vector物件---對於vector物件,可以採用下標方式隨意訪問他的某個元素,當然,也可以以下標方式對某元素重新賦值,這點類似於陣列的訪問方式;
採用上一節的例子,用下標的方法訪問容器內的元素:
#include<iostream>
#include<vector>
using namespace std;
int main(int argc,char *argv[])
{
vector<int>v(3);
v[0] = 2;
v[1] = 7;
v[2] = 9;
cout << v[0] << " "<< v[1] << " " << v[2] << endl;
return 0;
}
***迭代器方式訪問vector元素***
常使用迭代器配合for迴圈語句來對vector物件進行遍歷訪問,迭代器的額型別一定要與他要遍歷的vector物件的元素型別一致;
#include<iostream>
#include<vector>
using namespace std;
int main(int argc,char *argv[])
{
vector<int>v(3);
v[0] = 2;
v[1] = 7;
v[2] = 9;
//定義迭代器變數
vector <int> :: iterator it;
for(it=v.begin(); it != v.end(); it++) {
//輸出迭代器上的元素值;
cout << *it << "";
}
cout << endl; //換行;
return 0;
}
***vector元素插入***
insert()插入方法可以在vector物件的任意位置前插入一個新的元素,同時,vector自動擴張一個元素的空間,插入位置後的所有元素一次向後挪動一個位置;
要注意的是,insert()方法要求插入的位置,是元素的迭代器位置,而不是元素的下標;
執行結果:8 2 1 7 9 5 3
#include<iostream>
#include<vector>
using namespacestd;
int main(int argc,char *argv[])
{
vector <int> v(3);
vector <int> :: iterator it; //定義迭代器變數;
v[0] = 2;
v[1]= 7;
v[2] = 9;
v.insert(v.begin(), 8); //在最前面插入一個新元素,元素值為8;
v.insert(v.begin()+2, 1); //在第二個元素前插入新元素1;
v.insert(v.end(), 3); //在向量末尾追加新元素3;
v.insert(v.end()-1, 5); //在向量倒數第二個元素後面插入一個新元素5;
for(it=v.begin(); it != v.end(); it++) {
//輸出迭代器上的元素值;
cout << *it << "";
}
cout << endl; //換行;
return 0;
}
***vector元素刪除***
erase()方法可以刪除vector中迭代器所致的一個元素或一段區間中的所有元素。
clear()則一次性刪除vector中的所有元素;
#include<iostream>
#include<vector>
using namespace std;
int main(int argc,char *argv[])
{
vector <int> v(10);
vector <int> :: iterator it;
for(int i=0; i<10; i++) {
v[i] = i;
}
v.erase(v.begin()+2); //刪除第二個元素,從0開始計數;
for(it=v.begin(); it != v.end(); it++) {
cout << *it << "";
}
cout << endl;
v.erase(v.begin()+1, v.begin()+5); //刪除區間[1, 5)的元素;
for(it=v.begin(); it != v.end(); it++) {
cout << *it<< " ";
}
cout << endl;
v.clear(); //刪除全部元素;(清空向量)
cout << v.size() << endl; //輸出姓樑大小;
return 0;
}
***vector元素反向排列***
reverse反向排列演算法,需要定義標頭檔案#include<algorithm>;
reverse演算法可將向量中某段迭代器區間元素反向排列;
#include<iostream>
#include<vector>
#include<algorithm>
using namespacestd;
int main(int argc,char *argv[])
{
vector <int> v(10);
vector <int> :: iterator it;
for(int i=0;i<10; i++) {
v[i] = i;
}
for(it=v.begin(); it != v.end(); it++) {
cout << *it << "";
}
cout << endl;
reverse(v.begin(), v.end()); //反向排列向量的從頭到尾間的元素;
for(it=v.begin(); it != v.end(); it++) {
cout << *it << "";
}
cout << endl;
return 0;
}
***使用sort演算法對vector內元素排序***
使用sort演算法必須新增標頭檔案#include <algorithm>;
sort演算法要求使用隨機訪問迭代器進行排序,在預設的情況下,對向量元素進行升序排列;
跟對陣列排序的過程相似;
#include<iostream>
#include <vector>
#include<algorithm>
using namespace std;
int main(int argc,char *argv[])
{
vector <int> v;
vector <int> :: iterator it;
for(int i=0; i<10; i++) {
v.push_back(9-i);
}
for(int i=0; i<10; i++) { //輸出排序前的元素值;
cout << v[i] << "";
}
cout << endl;
sort(v.begin(), v.end()); //升序排列;
for(it=v.begin(); it != v.end(); it++){ //輸出排序後的元素值;
cout << *it << "";
}
cout << endl;
return 0;
}
還可以自己定義cmp排序比較函式,然後,把這個函式指定給sort演算法,那麼,sort就根據這個比較函式指定的排序規則進行排序。下例是從大到小排序;
#include<iostream>
#include<vector>
#include<algorithm>
using namespacestd;
bool cmp(constint a, const int b)
{
return a > b;
}
int main(int argc,char *argv[])
{
vector <int> v;
vector <int> :: iterator it;
for(int i=0; i<10; i++) {
v.push_back(i);
}
for(int i=0; i<10; i++) { //輸出排序前的元素值;
cout << v[i] << "";
}
cout << endl;
sort(v.begin(), v.end(), cmp); //升序排列;
for(it=v.begin(); it != v.end(); it++){ //輸出排序後的元素值;
cout << *it << " ";
}
cout << endl;
return 0;
}
升序排列也可以用以下兩種方式來實現:
sort(a.rbegin(), a.rend()); //從大到小排序
sort(a.begin(), a.end(), greater<int>()); //從大到小排序
執行:
Sample Input :
5
5 2 1 4 3
Sample Output:
5 4 3 2 1
看以下程式:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cstdlib>
#include <vector>
using namespace std;
int main()
{
vector <int> v;
int n;
while(~scanf("%d", &n)) {
int Mc;
for(int i=0; i<n; i++) {
scanf("%d", &Mc);
v.push_back(Mc);
}
sort(v.begin(), v.end(), greater<int>());
//sor(v.rbegin(), v.end());
vector <int> ::iterator it;
for(it=v.begin(); it!=v.end(); it++) {
cout << *it << " ";
}
cout << endl;
}
return 0;
}
排完序之後去重:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cstdlib>
#include <vector>
using namespace std;
int main()
{
vector <int> v;
int n;
while(~scanf("%d", &n)) {
int Mc;
v.clear();
for(int i=0; i<n; i++) {
scanf("%d", &Mc);
v.push_back(Mc);
}
sort(v.begin(), v.end(), greater<int>());
//sor(v.rbegin(), v.end());
int size = unique(v.begin(), v.end()) - v.begin();
vector <int> ::iterator it;
cout << "---size---" << size << endl;
for(int i=0; i<size; i++) {
cout << v[i] << " ";
}
cout << endl;
}
return 0;
}
執行:
Sample Input :
7
2 1 3 2 4 5 4
Sample Output:
---size---5
5 4 3 2 1
***向量的大小是否為空***
使用size()方法可以返回向量的大小,即元素的個數;
使用empty()方法可以返回向量是否為空;
以下是這兩種方法的簡單應用:
#include<iostream>
#include<vector>
using namespace std;
int main(int argc,char *argv[])
{
vector <int> v;
vector <int> :: iterator it;
for(int i=0; i<10; i++) { //給向量賦值;
v.push_back(i);
}
cout << v.size() << endl; //輸出向量的大小;(即元素的個數)
cout << v.empty() << endl; //判斷是否為空,如果非空,則返回0,如果空,則返回1;
v.clear();
cout << v.empty() <<endl;
return 0;
}
*** vector向量容器的應用 ZOJ 1208***
字串有些事對稱的,有些不是對稱的,請將那些對稱的字串安從小到大的順序輸出,字串先以長度論大小,如果長度相等,再以ASCII碼值為排序標準;
輸入描述: 輸入一個n,表示接下來有n組字串,串長<=256; n<=1000;
輸出描述: 根據每個字串,輸出對稱的那些串,並且要求按從小到大的順序輸出;
輸入樣例:
7
123321
123454321
123
321
sdfsdfd
121212
輸出樣例:
123321
123454321
#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
using namespace std;
bool cmp(const strings1, const string s2)
{
return (s1.length() != s2.length() ?s1.length() < s2.length() : s1 < s2);
}
int main()
{
vector <string> v;
vector <string>:: iterator it;
int n;
string s, t;
while(cin >> n) {
for(int i=0; i<n; i++) {
cin >> s;
t = s;
reverse(t.begin(), t.end());
if(t == s) {
v.push_back(s);
}
}
sort(v.begin(), v.end(), cmp);
for(it=v.begin(); it != v.end(); it++){
cout << *it<< endl;
}
}
return 0;
}