当前位置:首页 > C++知识 > 正文内容

STL入门——容器1:vector (不定长度数组)

亿万年的星光4年前 (2021-12-25)C++知识2815

一、定义 

    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;
}


扫描二维码推送至手机访问。

版权声明:本文由青少年编程知识记录发布,如需转载请注明出处。

分享给朋友:

相关文章

C++中的max和min函数(最大值,最小值)

1.头文件      最大值最小值函数所在头文件是#include<algorithm>2.用法#include<iostream> #incl...

【算法】前缀和与差分(3)二维数组前缀和

【算法】前缀和与差分(3)二维数组前缀和

0.前言前面的一篇文章,介绍了一维数组的前缀和,这篇文章中,介绍一下二维数组的前缀和1.定义二维数组的前缀和就是按照二维数组求和。公式如下:那二维前缀和中一个f[i][j]表示的意思就是以(1,1)为...

CSP-J2021年普及组复赛T3——网络连接

【题目描述】TCP/IP 协议是网络通信领域的一项重要协议。今天你的任务,就是尝试利用这个 协议,还原一个简化后的网络连接场景。在本问题中,计算机分为两大类:服务机(Server)和客户机(Clie...

图的访问与遍历-深度优先搜索

图的访问与遍历-深度优先搜索

一、图的遍历图的遍历是指从图中的某个顶点出发,按照一定规则访问图中所有顶点且每个顶点仅访问一次的过程,核心分为深度优先搜索(DFS) 和广度优先搜索(BFS) 两大类,适用于无向图...

【高级篇】C++ 中string的用法

【高级篇】C++ 中string的用法

0.概述string是C++标准库的一个重要部分,本意是字符串,和字符数组不同的是,字符数组是通过一个一个字符模拟的字符串,而string本身就是字符串,string在处理字符串问题时,十分强大。1....

【题解】士兵训练

【题目描述】某部队进行新兵队列训练,将新兵从一开始按顺序依次编号,并排成一行横队,训练的规则如下:从头开始一至二报数,凡报到二的出列,剩下的向小序号方向靠拢,再从头开始进行一至三报数,凡报到三的出列,...