1、vector概念
功能:vector的功能和数组非常相似,可以看成是一个升级版的数组。
vector和普通数组的区别:
(1)数组是静态的,长度不可改变,而vector可以动态扩展,增加长度。
(2)数组内数据通常存储在栈上,而vector中数据存储在堆上。
动态扩展并不是在原空间之后续接新空间,而是找到比原来更大的内存空间,将原数据拷贝到新空间,释放原空间。
2、vector库函数
2.1、构造函数
函数原型:
(1)vector<DataType> vec ; //使用模板类,默认构造函数
(2)vector(vec.begin(),vec.end()); //将[v.begin(),v.end())区间中的元素拷贝给本身
(3)vector(n, elem); //将n个elem拷贝给本身
(4)vector(const vector &vec) ; //拷贝构造函数
2.2、赋值操作
函数原型:
(1)vector& operator=(const vector &vec); //重载赋值运算符
(2)assign(vec.begin(), vec.end()); //将[v.begin(),v.end())区间中的元素赋值给本身
(3)assign(n, elem); //将n个elem赋值给本身
2.3、属性操作
函数原型:
(1)empty(); //判断容器是否为空,为空返回1,否则返回0
(2)capacity(); //返回容器的容量
(3)size(); //返回容器的大小,即容器中元素的个数
(4)resize(int num); //重新指定容器的长度为num,若容器变长,则以默认值0填充新位置,如果容器变短,则末尾超过容器长度的元素被删除
(5)resize(int num, int elem); //重新指定容器的长度为num,若容器变长,则以elem填充新位置,如果容器变短,则末尾超过容器长度的元素被删除
2.4、增加、删除
函数原型:
(1)push_back(ele); //尾部插入元素ele
(2)pop_back(); //删除最后一个元素
(3)insert(const_iterator pos, ele); //在迭代器指向的位置pos处插入一个元素ele
(4)insert(const_iterator pos, int count, ele); //在迭代器指向的位置pos处插入count个元素ele
(5)erase(const_iterator pos); //删除迭代器指向的元素
(6)erase(const_iterator begin, const_iterator end); //删除迭代器从begin到end之间的元素
(7)clear(); //删除容器中所有元素
2.5、vector数据存取
函数原型:(1)at(int idx);
//返回索引idx所指的数据(2)operator[];
//返回[]内索引所指的数据(3)front();
//返回容器中第一个元素(4)back();
//返回容器中最后一个元素
2.6、互换
函数原型:(1)swap(v);
//容器v和当前容器互换
2.7、预留空间
功能:减少vector在动态扩容时的扩展次数;每次使用push_back(v)时,如果容器v的大小要超过v的容量时,系统就会对v进行一次动态扩容,至于扩大多少空间,由系统决定。
函数原型:
(1)reserve(int len); //容器预留len个元素长度,也就是把容量扩为len,预留的位置并不初始化,同时也不可访问
2.8、data()函数
std::vector::data() 是 C++ 中的STL库函数,它返回一个指向内存数组的直接指针,该内存数组由向量内部用于存储其拥有的元素。
vector_name.data()
参数:该函数不接受任何参数。
返回值:该函数返回一个指向数组中第一个元素的指针,该指针在向量内部使用。
#include <iostream>
#include <vector>int main()
{std::vector<int> myvector(5);int *p = myvector.data();*p = 10;++p;*p = 20;p[2] = 100;std::cout << "myvector contains:";for (unsigned i = 0; i < myvector.size(); ++i)std::cout << ' ' << myvector[i];std::cout << std::endl;return 0;
}
结果为:
myvector contains: 10 20 0 100 0
3、迭代器(容器通用)
迭代器(iterator)是一种用于遍历数据集合的的对象。它提供了一种访问数据集合中元素的方式,而无需暴露数据集合内部的细节。使用迭代器,我们可以对数据集合中的每个元素进行处理,而无需将整个数据集合加载到内存中。这样可以节省内存空间,并且在处理大型数据集合时可以提高处理效率。
分类:
(1)前向迭代器 vector<int>::iterator
(2)只读迭代器 vector<int>::const_iterator
(3)逆向迭代器 vector<int>::reverse_iterator
(4)输入迭代器 istream_iterator<int>
(5)输出迭代器 ostream_iterator<int>
函数:
(1)begin() 返回指向容器的第一个元素的迭代器
(2)end() 返回指向容器的末尾值EOF的迭代器,即最后元素的下一个位置
(3)rbegin() 返回reverse iterator(end()),一个逆向迭代器,指向反序后的首元素
(4)rend() 返回reverse_iterator(begin()),一个逆向迭代器,指向反序后的尾元素,即首元素的前一个位置
C++ STL 迭代器:
C++ STL(标准模板库)中的容器类都提供了迭代器,用于访问容器内部的元素。迭代器是一个类或者一个指针,它可以指向容器中的一个元素,然后遍历容器中的所有元素。
C++ STL中的迭代器通常具有以下五个成员函数:
(1)operator*() 用于返回当前迭代器指向的元素的引用。
(2)operator->() 用于返回当前迭代器指向的元素的指针。
(3)operator++() 用于将迭代器移动到下一个元素。
(4)operator--() 用于将迭代器移动到上一个元素。
(5)operator==() 和 operator!=() 用于比较两个迭代器是否相等。
vector迭代器使用例子:
// 正向迭代器遍历
#include<iostream>
#include<vector>
using namespace std;
int main() {vector<int> v = { 1,2,3,4,5 };vector<int>::iterator it;for (it = v.begin(); it != v.end(); ++it) {cout << *it << " ";}return 0;
}
// 反向迭代器遍历
#include<iostream>
#include<vector>
using namespace std;
int main() {vector<int> v = { 1,2,3,4,5 };vector<int>::reverse_iterator it;for (it = v.rbegin(); it != v.rend(); ++it) {cout << *it << " ";}return 0;
}
// 使用auto关键字来简化迭代器
#include<iostream>
#include<vector>
using namespace std;
int main() {vector<int> v = { 1,2,3,4,5 };for (auto it = v.begin(); it != v.end(); ++it) {cout << *it << " ";}return 0;
}
4、示例
#include <vector>
#include <iostream>
using namespace std;void print_vector(vector<int> v)
{cout << "vector: ";for (auto it = v.begin(); it != v.end(); it++){cout << *it << " ";}cout << endl;
}int main()
{vector<int> vec1;vec1.push_back(11);vec1.push_back(19);vec1.push_back(140);vec1.push_back(6);vec1.push_back(1);vec1.push_back(22);vec1.push_back(33);vec1.push_back(44);vec1.push_back(55);print_vector(vec1);vector<int> vec2(10, 9999);print_vector(vec2);vector<int> vec3(vec1.begin() + 4, vec1.end());print_vector(vec3);vector<int> vec4;vec4.resize(156);cout << "vec4 size: " << vec4.size() << endl;swap(vec1, vec2);print_vector(vec1);print_vector(vec2);return 0;
}
结果为:
vector: 11 19 140 6 1 22 33 44 55
vector: 9999 9999 9999 9999 9999 9999 9999 9999 9999 9999
vector: 1 22 33 44 55
vec4 size: 156
vector: 9999 9999 9999 9999 9999 9999 9999 9999 9999 9999
vector: 11 19 140 6 1 22 33 44 55