目錄
vector:
vector實例化:
vector構造函數:
vector對象尾插:v1.push_back()
vector迭代器:
vector實例化string類型的對象
vector接口:
begin()+end()//rbegin()+rend()
resize():
vector:
vector是序列容器,表示大小可以變化的數組
其實就是之前學的順序表
vector實例化:
#include<iostream>
#include<vector>
#include<string>
using namespace std;
int main()
{//vector<數據類型>對象名(...)vector<int>v1;vector<int>v2(10,1);//用10個1來初始化v2vector<char>vector<double>vector<string>return 0;}
vector構造函數:
//n個val構造
vector<int>arr(10, 1);
for (auto x:arr)
{cout << x << " ";
}
//拷貝構造
vector<int>arr(10, 1);
vector<int>arr1(arr);
for (auto x : arr)
{cout << x << " ";
}//在c++11規則下,vector還支持類型數組一樣的初始化
vector<int>v1={1,2,3,4,5};//這里存在隱式類型轉換
//initializer list (6)
vector (initializer_list<value_type> il,//c++11下,新增的構造函數const allocator_type& alloc = allocator_type());
//它支持用一個花括號來初始化一個對象,這個對象的類型就是'initializer_list'
auto i1={1,2,3,4};//i1的類型是initializer_list,initializer_list可以理解為是一個容器,它支持用一個{}來初始化這個容器,這個容器只支持遍歷,不支持插入數據與刪除數據
//或者記憶為:vector不能實現參數多變,只能使用initializer_list對象****************************************************************************
vector<int>v1={1,2,3,4,5};//這個存在一個隱式類型轉換,原本是構造+拷貝構造,只不過被編譯器優化,變成了直接構造
vector<int>v2({1,2,3,4,5});//這里直接將參數傳給initializer_list構造函數
vector對象尾插:v1.push_back()
vector<int>v1;v1.push_back(1);v1.push_back(1);v1.push_back(1);v1.push_back(1);v1.push_back(1);for (int i=0;i<v1.size();i++){cout << v1[i] << " ";}
//assign
vector<int>v1 = {1,2,3,4,5};
v1.assign({10,20,30});//為v1分配一個新空間, 并把10,20,30賦值給v1,并修改v1的size
for (auto x : i1)
{cout << x << " ";
}
cout << endl;//insert
//1:
v1.insert(v1.begin(),10);//在當前位置插入一個值,不能輸坐標,只能用迭代器
for (auto e : v1)
{cout << e << " ";
}
cout << endl;
//2:
v1.insert(v1.begin(), 10,0);//在當前位置,插入10個0
for (auto e : v1)
{cout << e << " ";
}
cout << endl;
//3:
v1.insert(v1.begin(), v2.begin(), v2.end());//在當前位置,插入這一迭代器區間的值
for (auto e : v1)
{cout << e << " ";
}
cout << endl;//erase
v1.erase(v1.begin());//刪除迭代器位置的值
for (auto e : v1)
{cout << e << " ";
}
cout << endl;v1.erase(v1.begin(),v1.end());//刪除某一迭代器區間的值
for (auto e : v1)
{cout << e << " ";
}
cout << endl;//shrink_to_fit
vector<int>v1(10);
cout << v1.size() << endl;
cout << v1.capacity() << endl;v1.resize(5);
cout << v1.size() << endl;
cout << v1.capacity() << endl;v1.shrink_to_fit();//將空間縮容到與當前數據個數相同的大小
cout << v1.size() << endl;
cout << v1.capacity() << endl//data
vector<int>v1 = { 1,2,3,4,5,6,7 };
int* p = v1.data();//返回指向這一數組的指針for (int i=0;i<v1.size();i++)
{cout << (*p) << endl;p++;
}//emplace
vector<int>v1 = { 1,2,3,4,5,6,7 };
auto it = v1.begin();
v1.emplace(it,10);//在當前迭代器的位置插入數據
for (auto e : v1)
{cout << e << " ";
}//emplace
vector<int>v1 = { 1,2,3,4,5,6,7 };
v1.emplace_back(100);//在容器末尾插入數據
for (auto e : v1)
{cout << e << " ";
}
vector<int>v1 = {1,2,3,4,5,6,7};
v1[9]++;//[]越界直接斷言報錯vector<int>v1 = {1,2,3,4,5,6,7};
cout << v1.at(9) << endl;//拋異常
vector迭代器:
vector<int>v1;v1.push_back(1);v1.push_back(1);v1.push_back(1);v1.push_back(1);v1.push_back(1);vector<int>::iterator it1 = v1.begin();//it1為迭代器名while (it1!=v1.end()){cout << *it1 << " ";++it1;}
*************************************
//迭代器失效
void insert(iterator pos, const T& x)
{assert(pos>=_start&&pos<=_finish);if (_finish==_endofstorage){size_t len = pos - _start;//迭代器失效->因為一些原因,迭代器不可用reserve(capacity()==0?4:capacity()*2);pos = _start + len;//雖然更新了pos,但是對形參的修改不會影響實參}iterator i = _finish - 1;while (i>=pos){*(i + 1) = *i;--i;}*pos = x;++_finish;
}if (it!=v1.end())
{it = v1.insert(it, 10 * x);cout << *it << endl;//迭代器失效
}
//it做為實參,將值傳給形參pos,當不需擴容時,不會存在迭代器失效的問題
//若需要擴容,雖然我們對pos進行了更新,但是對作為形參的pos進行修改不會影響到實參it//迭代器失效的兩種原因://1.擴容引起的野指針失效//2.刪除數據,迭代器已經不是指向之前的位置了,這就導致可能會造成邏輯錯誤
vector實例化string類型的對象
vector<string>vstr;
string s1 = "張三";
vstr.push_back(s1);
vstr.push_back("李四");//單參數構造函數支持隱式類型轉換vector<string>vstr;
string s1 = "張三";vstr.push_back(s1);
vstr.push_back("李四");for (const auto& e:vstr)//auto&是為了減少拷貝,const是為了防止數據被修改
{//e[0]++;cout << e << " ";
}vstr[0] += 'x';//vstr[0]表示訪問第一個string類型的值,就是張三,+='x'就表示在張三后面加上一個'x'vstr[0] +="hello";//為什么支持+=?因為實例化的是string類型,這里調用的實際上是string類型的+=vstr[0][1]++;vstr[0][1]++;vstr[0][1]++;vstr[1][1]++;vstr[1][1]++;vstr[1][1]++;for (const auto& x:vstr){cout << x;}
vector接口:
begin()+end()//rbegin()+rend()
//與string類中的接口類似
vector<int>arr(10,1);
vector<int>arr1(arr.begin(), arr.end());//迭代器初始化構造
for (auto x:arr1)
{cout << x;
}
都與string類中的接口用法一樣。
resize():
改變的是對象中有效字符的個數,當改變的值大于當前空間值時,會增容。