vector容器
1.基本概念
<vector>
是 STL 中的一个容器类,不同于普通数组的静态空间,vector可以动态扩展。
动态扩展:并不是在原空间连接新空间,而是找到更大的内存空间,将原数据拷贝到新空间,释放原空间。
<vector>
是一个序列容器,它允许用户在容器的末尾快速地添加或删除元素。与数组相比,<vector>
提供了更多的功能,如自动调整大小、随机访问等。
2.声明与初始化
<vector>
需要指定元素类型,可通过多种方式进行初始化:
#include <iostream>
#include <vector>
using namespace std;
//声明vector容器
int main() {vector<int> vec1; // 空的vectorvector<int> vec2(5); // 长度为5的vector,元素默认初始化vector<int> vec3(5, 10); // 长度为5的vector,元素值为10vector<int> vec4 = {1, 2, 3, 4}; // 使用初始化列表初始化return 0;
}
3.<vector>中常用的成员函数
下面是一个使用 <vector>
的简单示例:
#include <iostream>
#include <vector>
using namespace std;int main() {// 声明一个存储整数的 vectorvector<int> numbers;// 添加元素numbers.push_back(10);numbers.push_back(20);numbers.push_back(30);// 输出 vector 中的元素cout << "Vector contains: ";for (int i = 0; i < numbers.size(); ++i) {cout << numbers[i] << " ";}cout << endl;// 添加更多元素numbers.push_back(40);numbers.push_back(50);// 再次输出 vector 中的元素cout << "After adding more elements, vector contains: ";for (int i = 0; i < numbers.size(); ++i) {cout << numbers[i] << " ";}cout << endl;// 访问特定元素cout << "The first element is: " << numbers[0] << endl;// 清空 vectornumbers.clear();// 检查 vector 是否为空if (numbers.empty()) {cout << "The vector is now empty." << endl;}return 0;
}
4.三种遍历容器中元素的方式
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;void Myprint(int val){cout<<val<<endl;
}void test1(){vector<int> v;//向容器中存放数据v.push_back(10);v.push_back(20);v.push_back(30);v.push_back(40);//每一个容器都有自己的迭代器,迭代器是用来遍历容器中的元素//v.begin()返回迭代器,指向容器第一个元素 //v.end()返回迭代器,指向最末元素的下一个位置 //vector<int>::iteratorvector<int>::iterator pbegin=v.begin();vector<int>::iterator pend=v.end();//第一种遍历方法while (pbegin != pend){cout<<*pbegin<<endl;pbegin++;} //第二种遍历方法for(vector<int>::iterator it=v.begin();it!=v.end();it++){cout<<*it<<endl;} //第三种遍历方法//使用for_each算法,头文件 algorithmfor_each(v.begin(),v.end(),Myprint);
}
int main(){test1();return 0;
}
5.示例
-
基本操作
#include <iostream>
#include <vector>
using namespace std;int main() {vector<int> vec = {1, 2, 3, 4, 5};//声明vector容器,列表初始化// 输出所有元素cout << "Vector elements: ";for (int i = 0; i < vec.size(); ++i) {cout << vec[i] << " ";}cout << endl;// 获取第一个和最后一个元素cout << "First element: " << vec.front() << endl;cout << "Last element: " << vec.back() << endl;return 0;
}
-
容量大小
#include <iostream>
#include <vector>
using namespace std;void printvector(vector<int> &v1){for(vector<int>::iterator it=v1.begin();it!=v1.end();it++){cout<<*it<<" ";}
}void test1(){vector<int> v1;for(int i=0;i<10;i++){v1.push_back(i);}printvector(v1);//判断容器是否为空if(v1.empty()){cout<<"v1为空"<<endl;} else{cout<<"v1不为空"<<endl;cout<<"v1的容量为"<<v1.capacity()<<endl;cout<<"v1的大小为"<<v1.size()<<endl;}//重新指定大小v1.resize(15);//如果重新指定的比原来长,默认用0填充。也可以指定默认填充值printvector(v1); v1.resize(5);//如果重新指定的比原来短,超出的部分删除掉printvector(v1);
}
int main(){test1();return 0;
}
-
插入删除
#include <iostream>
#include <vector>
using namespace std;//遍历容器中的元素
void printvector(vector<int> &v){for(vector<int>::iterator it=v.begin();it!=v.end();it++){cout<< *it <<" ";}cout<<endl;
}void test1(){vector<int>v;//尾插插入元素v.push_back(10); v.push_back(20);v.push_back(30);v.push_back(40);v.push_back(50);printvector(v);//尾删v.pop_back();printvector(v);//insert插入 v.insert(v.begin(),100);printvector(v);v.insert(v.begin(),2,100);printvector(v); //删除v.erase(v.begin());printvector(v);
}
int main(){void test1();return 0;
}
-
互换容器
#include <iostream>
#include <vector>
using namespace std;
void printvector(vector<int> &v){for(vector<int>::iterator it=v.begin();it!=v.end();it++){cout<< *it <<" ";}cout<<endl;
}void test1(){vector<int>v1;for(int i=0;i<10;i++){v1.push_back(i);}printvector(v1);vector<int>v2;for(int i=10;i>0;i--){v2.push_back(i);}printvector(v2);//互换v1.swap(v2);printvector(v1);printvector(v2);
}
int main(){test1();return 0;
}
-
预留空间
#include <iostream>
#include <vector>
using namespace std;int main() {vector<int> vec;vec.reserve(10); // 预留容量,避免频繁分配内存for (int i = 0; i < 10; ++i) {vec.push_back(i);cout << "Capacity after push_back(" << i << "): " << vec.capacity() << endl;}return 0;
}
6.vector容器实战+蓝桥杯常用技巧排序,去重
#include <iostream>
#include <vector>
#include <algorithm> // 包含sort算法
using namespace std;int main() {vector<int> nums = {3, 1, 4, 1, 5, 9, 2, 6};// 排序+去重(蓝桥杯常用技巧)sort(nums.begin(), nums.end());auto last = unique(nums.begin(), nums.end());nums.erase(last, nums.end());// 遍历输出(C++11范围for)for (int num : nums) {cout << num << " ";}return 0;
}
sort算法
sort(nums.begin(), nums.end()); :调用 sort 算法对 nums 容器中的元素进行排序。 排序后, nums 中的元素会按照升序排列。(sort函数会默认使用小于运算符<来确定元素的顺序。)
nums.begin() 返回指向容器第一个元素的迭代器, nums.end() 返回指向容器最后一个元素的下一个位置的迭代器。即左开右闭区间【nums.begin( ) , nums.end( ))
升序排列示例如下:
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;int main() {// 对vector<int>进行排序vector<int> nums = {5, 2, 8, 1, 9, 3, 7, 4, 6};sort(nums.begin(), nums.end());cout << "升序排序结果: ";for (int num : nums) {cout << num << " ";}cout << endl;return 0;
}
降序排列示例如下:
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;bool compare(int a, int b) {return a > b; // 降序比较函数
}int main() {// 使用自定义比较函数进行降序排序vector<int> nums2 = {5, 2, 8, 1, 9, 3, 7, 4, 6};sort(nums2.begin(), nums2.end(), compare);cout << "降序排序结果: ";for (int num : nums2) {cout << num << " ";}cout << endl;return 0;
}
unique算法
C++中,unique() 函数用于去除容器或数组中相邻元素之间重复出现的元素。因此,在使用 unique() 函数之前,必须先对数组或容器进行排序。此外,unique() 函数的返回值是去重后序列的新末尾地址。
auto last = unique(nums.begin( ), nums.end( ) ); nums.begin( ) 返回指向容器第一个元素的迭代器, nums.end( ) 返回指向容器最后一个元素的下一个位置的迭代器。即左开右闭区间【nums.begin( ) , nums.end( ))
unique 算法会遍历这个区间,将相邻的重复元素中除了第一个之外的其他元素移动到序列的后面。它不会真正删除元素,而是返回一个迭代器,指向去重后新序列的逻辑末尾(即最后一个不重复元素的下一个位置)。在代码中,这个返回的迭代器被赋值给 last 。
例如,假设 nums 容器中的元素初始为 {3, 1, 2, 2, 3, 3, 1} ,排序后变为 {1, 1, 2, 2, 3, 3, 3} ,经过 unique 算法处理后,容器中的元素可能变为 {1, 2, 3, 2, 3, 3, 1} (其中 1 、 2 、 3 是不重复的元素,后面的 2 、 3 、 1 是原来重复的元素,但位置被移动了), last 迭代器指向 3 后面的那个 2 的位置。
nums.erase(last, nums.end()); 这行代码使用 erase 成员函数,根据 unique 算法返回的 last 迭代器,删除容器中超出新逻辑末尾的元素,真正实现了去重的效果。以上面的例子来说,执行完这行代码后, nums 容器中的元素就变为 {1, 2, 3} ,完成了对原始序列的去重操作。
for (元素类型 元素变量 : 容器或数组)
元素类型 是容器或数组中存储的元素的数据类型
元素变量 是一个临时变量,用于在每次循环迭代时存储容器或数组中的一个元素, 容器或数组是要遍历的对象。
它简化了对容器(如 vector 、 array 等)或数组中元素的遍历操作。在 for (int num : nums) 中, int 是 nums 容器中元素的类型(因为 nums 是 vector<int> 类型,存储的是整数), num 是一个临时变量,用于在每次循环中存储 nums 中的一个元素, nums 是要遍历的 vector 容器。