Vector的相關內容
關於容器
c++中有兩種類型的容器:順序容器和關聯容器
順序容器:vector、list、deque等。其中vector表示一段連續的內存地址,基於數組的實現,list表示非連續的內存,基於鏈表實現。deque與vector類似,但是對於首元素提供刪除和插入的雙向支持。
關聯容器:map、set。map是key-value形式的,set是單值。map和set只能存放唯一的key值,multimap和multiset可以存放多個相同的key值。
容器類自動申請和釋放內存,我們無需new和delete操作。1
關於vector
vector(向量): C++中的一種數據結構,確切的說是一個類.它相當於一個動態的數組,當程序員無法知道自己需要的數組的規模多大時,用其來解決問題可以達到最大節約空間的目的.2
vector定義和初始化
vector<int> vec1; //默認初始化,vec1爲空,類型爲int
vector<int> vec2(vec1); //使用vec1初始化vec2
vector<int> vec3(vec1.begin(),vec1.end());//使用vec1初始化vec2
vector<int> vec4(10); //10個值爲0的元素
vector<int> vec5(10,4); //10個值爲4的元素
- 1
- 2
- 3
- 4
- 5
vec.push_back()
在vector類中作用爲在vector尾部加入一個數據。 vec.push_back(1);
vec.insert()
//用法1:在指定位置it前“插入”值爲val的元素,返回指向這個元素的迭代器,
iterator insert( iterator it, const TYPE &val );
//用法2:在指定位置it前“插入”num個值爲val的元素
void insert( iterator it, size_type num, const TYPE &val );
//用法3:在指定位置it前“插入”區間[start, end)的所有元素.
void insert( iterator it, input_iterator start, input_iterator end );
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
vec.erase()
(1)erase(pos,n); 刪除從pos開始的n個字符,比如erase(0,1)就是刪除第一個字符
(2)erase(position);刪除position處的一個字符(position是個string類型的迭代器)
(3)erase(first,last);刪除從first到last之間的字符(first和last都是迭代器)
#include <iostream>
#include <string>
using namespace std;
int main ()
{
string str ("This is an example phrase.");
string::iterator it;
// 第(1)種用法
str.erase (10,8);
cout << str << endl; // "This is an phrase."
// 第(2)種用法
it=str.begin()+9;
str.erase (it);
cout << str << endl; // "This is a phrase."
// 第(3)種用法
str.erase (str.begin()+5, str.end()-7);
cout << str << endl; // "This phrase." 閉區間全刪了
return 0;
}
vector<\type>::iterator name
vector<int>::iterator it;
這條語句定義了一個名爲it的變量,它的數據類型是由vector定義的iterator類型。
初始化
it=vec.begin();
指向了容器的首個元素
訪問
*it
訪問迭代器指向的元素
運算
iterator除了進行++,–操作,可以將iter+n,iter-n賦給一個新的iteraor對象。還可以使用一個iterator減去另外一個iterator.
常用的一個格式
(我覺得常用的(逃))
#include <vector>
#include <iostream>
using namespace std;
int main() {
vector<int> ivec;
ivec.push_back(1);
ivec.push_back(2);
ivec.push_back(3);
ivec.push_back(4);
for(vector<int>::iterator iter = ivec.begin();1. iter != ivec.end(); ++iter)//遍歷
cout << *iter << endl;
}
迭代器與指針的差別
迭代器:
(1)迭代器不是指針,是類模板,表現的像指針。他只是模擬了指針的一些功能,通過重載了指針的一些操作符,->,*,++ –等封裝了指針,是一個“可遍歷STL( Standard Template Library)容器內全部或部分元素”的對象, 本質是封裝了原生指針,是指針概念的一種提升(lift),提供了比指針更高級的行爲,相當於一種智能指針,他可以根據不同類型的數據結構來實現不同的++,–等操作;
(2)迭代器返回的是對象引用而不是對象的值,所以cout只能輸出迭代器使用*取值後的值而不能直接輸出其自身。
(3)在設計模式中有一種模式叫迭代器模式,簡單來說就是提供一種方法,在不需要暴露某個容器的內部表現形式情況下,使之能依次訪問該容器中的各個元素,這種設計思維在STL中得到了廣泛的應用,是STL的關鍵所在,通過迭代器,容器和算法可以有機的粘合在一起,只要對算法給予不同的迭代器,就可以對不同容器進行相同的操作。
指針:
指針能指向函數而迭代器不行,迭代器只能指向容器;指針是迭代器的一種。指針只能用於某些特定的容器;迭代器是指針的抽象和泛化。所以,指針滿足迭代器的一切要求。
注:迭代器在使用後就釋放了,不能再繼續使用,但是指針可以!!
總之,指針和迭代器是有很大差別的,雖然他們表現的行爲相似,但是本質是不一樣的!一個是類模板,一個是存放一個傢伙的地址的指針變量。
#include <iostream>
#include<vector>
using namespace std;
void main(){
vector<int> the_vector;
vector<int>::iterator the_iterator;
for (int i = 0; i < 10; i++)
the_vector.push_back(i);
int total = 0;
the_iterator = the_vector.begin();
while (the_iterator != the_vector.end()) {
total += *the_iterator;
the_iterator++;
}
cout << "Total=" << total << endl;
printf("hello...\n");
system("pause");
return;
}
運行結構爲:Total=45
hello.....
//轉自:https://blog.csdn.net/weixin_39777226/article/details/79192770