1. vector容器基本概念
vector的数据安排以及操作方式,与数组非常相似,两者的唯一差别在于空间的运用的灵活性。数组是静态空间,一旦配置了就不能改变,vector是动态空间,随着元素的加入,它的内部机制会自动扩充空间以容纳新元素。
2. vector迭代器
vector维护一个线性空间,所以不论元素的型别如何,普通指针都可以作为vector的迭代器。vector支持随机存取提供的是随机访问迭代器。例如普通迭代器使用为vector<int>::iterator it1=v.begin();
、反转迭代器使用为vector<int>::reverse_iterator it2=v.rbegin();
、只读迭代器使用为vector<int>::const_iterator it3=v.end();
3. vector的数据结构
vector所采用的数据结构非常简单,线性连续空间,它以两个迭代器 _Myfirst 和 _Mylast分别指向配置得来的连续空间中目前已被使用的范围,并以迭代器 _Myend指向整块连续内存空间的尾端,一个vector的容量永远大于或等于其大小,一旦容量等于大小,便是满载,下次再有新增元素,整个vector容器就得扩容。
扩容是动态增加大小,并不是在原空间之后续接新空间(因为无法保证原空间之后尚有可配置的空间),而是一块更大的内存空间,然后将原数据拷贝新空间,并释放原空间。因此,对vector的任何操作,一旦引起空间的重新配置,指向原vector的所有迭代器就都失效了。
鉴于vector会自动扩容,在实际使用中可以使用v.resize(n)
进行空间的更改以及v.reserve(n)
进行空间的提前预留。
4. vector容器基本使用
#include<iostream>
#include<vector>//单端动态数组 容器头文件
#include<algorithm>//算法头文件,仅随机访问迭代器可以使用
using namespace std;
//自定义数据类型
class Person {
public:
Person(string name, int age) {
this->m_Name = name;
this->m_Age = age;
}
string m_Name;
int m_Age;
};
void myPrint(int num) {//输出函数
cout << num << endl;
}
//使用仿函数
class my_Print{
public:
void operator()(int num){ //输出函数仿函数
cout << num << endl;
}
};
bool myCompare(Person& p1, Person& p2) {//规定的排序方式函数,按照TRUE的方式排序
if (p1.m_Age == p2.m_Age) {
return p1.m_Name < p2.m_Name;
}
return p1.m_Age < p2.m_Age;
}
//使用仿函数
class my_Compare{
public:
bool operator()(Person& p1, Person& p2) {//按照TRUE的方式排序
if (p1.m_Age == p2.m_Age) {
return p1.m_Name < p2.m_Name;
}
return p1.m_Age < p2.m_Age;
}
};
void test1() {
vector<int> v1;//创建vector容器vector<T> v采用模板类实现,默认构造函数
//插入数据
v1.push_back(10);
v1.push_back(20);
v1.push_back(30);
v1.push_back(40);
//利用迭代器遍历
//v.begin()开始迭代器 指向第一个元素位置
vector<int>::iterator itBegin = v1.begin();
//v.end()结束迭代器 指向最后一个元素下一个位置
vector<int>::iterator itEnd = v1.end();
while (itBegin != itEnd)
{
cout << *itBegin << endl;
itBegin++;
}
//利用循环遍历
for (vector<int>::iterator it = v1.begin(); it != v1.end();it++) {
cout << *it << endl;
}
//利用循环逆序遍历 v.rbegin()迭代器 指向最后一个元素,v.rend()迭代器 指向首个元素前一个位置
for(vector<int>::reverse_iterator it=v1.rbegin();it!=v1.rend();it++){
cout<<*it<<endl;
}
//使用遍历算法,将遍历到的数据传入函数myPrint
for_each(v1.begin(), v1.end(), myPrint);
//使用仿函数 for_each(v1.begin(), v1.end(), my_Print());
//使用排序算法进行排序
sort(v1.begin(), v1.end());
}
void test2() {
vector<Person> v2;
Person p1("AAA", 11);
Person p2("BBB", 22);
Person p3("CCC", 33);
v2.push_back(p1);
v2.push_back(p2);
v2.push_back(p3);
//(*it).m_Name==it->m_Name
for (vector<Person>::iterator it = v2.begin(); it != v2.end(); it++) {
cout << "姓名--" << it->m_Name << " 年龄--" << it->m_Age << endl;
}
//自定义类型使用排序算法sort必须传入排序规则函数才可
sort(v2.begin(), v2.end(),myCompare);//对vector进行排序,传入排序规则函数
//使用仿函数 sort(v2.begin(), v2.end(),my_Compare());
}
//添加指针类型
void test3() {
vector<Person*> v3;
Person p1("AAA", 11);
Person p2("BBB", 22);
Person p3("CCC", 33);
v3.push_back(&p1);
v3.push_back(&p2);
v3.push_back(&p3);
for (vector<Person*>::iterator it = v3.begin(); it != v3.end(); it++) {
cout << "姓名--" << (*it)->m_Name << " 年龄--" << (*it)->m_Age << endl;
}
}
//容器嵌套
void test4() {
vector<vector<int>> v4;
vector<int> v5;
vector<int> v6;
vector<int> v7;
for (int i = 0; i < 5; i++) {
v5.push_back(i + 1);
v6.push_back(i + 10);
v7.push_back(i + 100);
}
//小容器插入大容器
v4.push_back(v5);
v4.push_back(v6);
v4.push_back(v7);
//遍历
for (vector<vector<int>>::iterator it = v4.begin(); it != v4.end(); it++) {
//*it==vector<int> ...
for (vector<int>::iterator it1 = it->begin(); it1 != it->end(); it1++) {
cout << *it1 << " ";
}
cout << endl;
}
}
int main() {
//test1();
//test2();
test3();
test4();
return 0;
}