STL入门——容器1:vector (不定长度数组)
一、定义
vector是一个不定长度数组。不仅如此,它把一些常用操作“封装”在了 vector 类型内部。
vector 是一个模板类,所以需要用 vector<int> a 或者 vector<double> b 这样的方式来声明一个 vector 。vector<int> 是一个类似于 int a[] 的整数数组,而 vector<string> 就是一个类似于 string a[] 字符串数组。vector 看上去是“一等公民”,因为它们可以直接赋值,还可以作为函数的参数或者返回值,而无须像传递数组那样另外用一个变量指定元素的个数。
它的中文名字叫做“动态数组”或者“不定长数组”。
二、基本操作
1.定义
#include <iostream>
#include <vector>
using namespace std;
int main(){
vector <int> i;//一个int的动态数组
vector <char> c;//一个char的动态数组
vector <node> n;//一个node的动态数组(node是结构体名)
return 0;
}2.数据插入
#include <iostream>
#include <vector>
using namespace std;
int main(){
vector <int> a;//一个int的动态数组
int x;
for(int i=0;i<10;i++){
cin>>x;
a.push_back(x);
}
return 0;
}其中,push_back意为在尾部添加一个元素。
3.数据的输出
#include <iostream>
#include <vector>
using namespace std;
int main(){
vector <int> a;//一个int的动态数组
int x;
for(int i=0;i<5;i++){
cin>>x;
a.push_back(x);
}
//输出
for(int i=0;i<a.size();i++){
cout<<a[i]<<" ";
}
return 0;
}
4.测试多次输入输出
#include <iostream>
#include <vector>
using namespace std;
int main(){
vector <int> a;//一个int的动态数组
int x;
for(int i=0;i<3;i++){
cin>>x;
a.push_back(x);
}
//输出
for(int i=0;i<a.size();i++){
cout<<a[i]<<" ";
}
cout<<endl<<"------------"<<endl;
// 第二次输入
for(int i=0;i<4;i++){
cin>>x;
a.push_back(x);
}
//输出
for(int i=0;i<a.size();i++){
cout<<a[i]<<" ";
}
return 0;
}结果:
1 3 4 1 3 4 ------------ 1 6 7 8 1 3 4 1 6 7 8
5.数组直接赋值操作
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector <int> a,b;//一个int的动态数组
int x;
for(int i=0; i<5; i++) {
cin>>x;
a.push_back(x);
}
//输出
cout<<"a=";
for(int i=0; i<a.size(); i++) {
cout<<a[i]<<" ";
}
b=a; //数组直接赋值
cout<<endl<<"b=";
for(int i=0; i<b.size(); i++) {
cout<<b[i]<<" ";
}
return 0;
}数组可以直接同步赋值。
结论:
3 4 5 3 1 a=3 4 5 3 1 b=3 4 5 3 1
6.数据插入操作
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector <int> a,b;//一个int的动态数组
int x;
for(int i=0; i<5; i++) {
cin>>x;
a.push_back(x);
}
//输出
cout<<"a=";
for(int i=0; i<a.size(); i++) {
cout<<a[i]<<" ";
}
cout<<endl;
a.insert(a.begin()+1,3,5); //在a的第1个元素(从第0个算起)的位置插入3个数,其值都为5
//输出
cout<<"a=";
for(int i=0; i<a.size(); i++) {
cout<<a[i]<<" ";
}
return 0;
}结论:
3 4 5 6 7 a=3 4 5 6 7 a=3 5 5 5 4 5 6 7
第二种用法:
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector <int> a;//一个int的动态数组
int b[10]={3,4,6,2,1,6,3};
int x;
for(int i=0; i<5; i++) {
cin>>x;
a.push_back(x);
}
//输出
cout<<"a=";
for(int i=0; i<a.size(); i++) {
cout<<a[i]<<" ";
}
cout<<endl;
a.insert(a.begin()+1,b+3,b+6); //b为数组,在a的第1个元素(从第0个算起)的
//位置插入b的第3个元素到第5个元素(不包括b+6),
//如b为1,2,3,4,5,9,8 ,插入元素后为1,4,5,9,2,3,4,5,9,8
//输出
cout<<"a=";
for(int i=0; i<a.size(); i++) {
cout<<a[i]<<" ";
}
return 0;
}结论:
7 8 9 0 1 a=7 8 9 0 1 a=7 2 1 6 8 9 0 1
7.其他常用方法
c.assign(beg,end) 将(beg; end)区间中的数据赋值给c。 c.assign(n,elem) 将n个elem的拷贝赋值给c。 c. at(idx) 传回索引idx所指的数据,如果idx越界,抛出out_of_range。 c.back() 传回最后一个数据,不检查这个数据是否存在。 c.begin() 传回迭代器中的第一个数据地址。 c.capacity() 返回容器中数据个数。 c.clear() 移除容器中所有数据。 c.empty() 判断容器是否为空。 c.end() // 指向迭代器中末端元素的下一个,指向一个不存在元素。 c.erase(pos) // 删除pos位置的数据,传回下一个数据的位置。 c.erase(beg,end) 删除[beg,end)区间的数据,传回下一个数据的位置。 c.front() 传回第一个数据。 get_allocator 使用构造函数返回一个拷贝。 c.insert(pos,elem) // 在pos位置插入一个elem拷贝,传回新数据位置 c.insert(pos,n,elem) // 在pos位置插入n个elem数据,无返回值 c.insert(pos,beg,end) // 在pos位置插入在[beg,end)区间的数据。无返回值 c.max_size() 返回容器中最大数据的数量。 c.pop_back() 删除最后一个数据。 c.push_back(elem) 在尾部加入一个数据。 c.rbegin() 传回一个逆向队列的第一个数据。 c.rend() 传回一个逆向队列的最后一个数据的下一个位置。 c.resize(num) 重新指定队列的长度。 c.reserve() 保留适当的容量。 c.size() 返回容器中实际数据的个数。 c1.swap(c2) // 将c1和c2元素互换
8.二维vector
#include <iostream>
#include <vector>
using namespace std;
int main() {
// 1. 创建并初始化二维vector
vector<vector<int>> matrix = {
{1, 2, 3}, // 第0行
{4, 5, 6}, // 第1行
{7, 8, 9} // 第2行
};
// 2. 添加新行(演示动态扩展)
matrix.push_back({10, 11, 12}); // 第3行
// 3. 添加不规则行(演示每行长度可以不同)
matrix.push_back({13, 14}); // 第4行,只有2个元素
// 4. 打印原始矩阵
cout << "原始矩阵:" << endl;
for(int i = 0; i < matrix.size(); i++) {
cout << "第" << i << "行: ";
for(int j = 0; j < matrix[i].size(); j++) {
cout << matrix[i][j] << " ";
}
cout << endl;
}
// 5. 访问特定元素
cout << "\n访问特定元素:" << endl;
cout << "matrix[0][1] = " << matrix[0][1] << endl; // 第0行第1列:2
cout << "matrix[2][0] = " << matrix[2][0] << endl; // 第2行第0列:7
// 6. 修改元素
matrix[1][2] = 66; // 将第1行第2列从6改为66
cout << "\n修改后 matrix[1][2] = " << matrix[1][2] << endl;
// 7. 获取维度信息
cout << "\n矩阵维度:" << endl;
cout << "行数: " << matrix.size() << endl;
cout << "各行列数: ";
for(int i = 0; i < matrix.size(); i++) {
cout << matrix[i].size() << " ";
}
cout << endl;
// 8. 使用明确类型的迭代器遍历
cout << "\n使用迭代器遍历:" << endl;
for(vector<vector<int>>::iterator row = matrix.begin(); row != matrix.end(); row++) {
for(vector<int>::iterator col = row->begin(); col != row->end(); col++) {
cout << *col << " ";
}
cout << endl;
}
// 9. 使用索引遍历(替代范围for循环)
cout << "\n使用索引遍历:" << endl;
for(int i = 0; i < matrix.size(); i++) {
for(int j = 0; j < matrix[i].size(); j++) {
cout << matrix[i][j] << " ";
}
cout << endl;
}
// 10. 演示更多操作
cout << "\n更多操作演示:" << endl;
// 在特定行插入元素
matrix[0].insert(matrix[0].begin() + 1, 99); // 在第0行第1个位置插入99
cout << "在第0行插入99后: ";
for(int j = 0; j < matrix[0].size(); j++) {
cout << matrix[0][j] << " ";
}
cout << endl;
// 删除行
matrix.pop_back(); // 删除最后一行
cout << "删除最后一行后行数: " << matrix.size() << endl;
// 清空所有数据
matrix.clear();
cout << "清空后行数: " << matrix.size() << endl;
return 0;
}扫描二维码推送至手机访问。
版权声明:本文由青少年编程知识记录发布,如需转载请注明出处。


