信息学奥赛第十一节 —— STL、vector的基本操作(一维与二维vector)

vector的入门概念
  • STL:标准模板库(一些容器的集合)
  • 容器:用来管理一类对象的集合。可以说数组也是一个容器。
  • 常见的容器:向量、栈、队列、优先队列、链表、集合、映射
  • 迭代器:用来遍历对象集合的元素,或者说迭代器是用来遍历容器中元素的工具。需要注意的是并不是所有的容器都支持迭代器,例如需要遵循先进后出原则的栈就不支持迭代器。

概念vector是一个顺序的容器,能够存放各种类型的对象。可以将其理解为一个能存放任意类型的动态数组(可变长的数组)。

vector的初始化

  • vector():创建一个空向量
  • vector(n):创建一个长度为n的向量
  • vector(n,t):创建一个长度为n,元素为t的向量

vector的定义vector<int> v;

vector中的函数
函数功能
insert(pos,x)插入元素x到vector的指定位置
push_back(x)添加一个元素x到vector的后面
erase(pos)删除指定位置的元素
erase(pos1,pos2)删除向量中[pos1,pos2]区间中的元素
pop_back()弹出或删除vector的最后一个元素
clear()清除vector中所有的元素,size()变为0
front()取vector的第一个元素
back()取vector的最后一个元素
begin()返回vector的头指针,指向第一个元素
end()返回vector的尾指针,指向最后一个元素的下一个位置
运算符[i]取vector下标为i的元素
size()返回vector中实际元素的个数
empty()判断vector是否为空
vector与数组
  • 对于数组,其大小是固定的。vector的大小是可变的,开始vector为空,随着不断插入元素,vector自动申请空间,容量变大。一般每次申请空间的大小是现有元素的两倍。
  • 要熟练使用sort()reverse()等函数对vector进行排序、逆序等操作
  • 当数组为空时,可以使用下标遍历数组。若数组定义为全局变量,则数组元素默认全为0。而当vector为空时,不能使用下标来访问。
测试代码
#include <iostream>
#include <algorithm>
#include <vector>
//reverse需要用到头文件algorithm

using namespace std;

void print(vector<int> v)//遍历容器函数
{
    for (int i = 0;i < v.size();i++) cout << v[i] << " ";
    cout << endl;
}

int main()
{
    vector<int> v;
    cout << v.size() << endl;//0
    
    v.push_back(2); v.push_back(3); v.push_back(1); v.push_back(4);
    cout << v.size() << endl;//4
    
    print(v);//2 3 1 4
    cout << v[0] << " " << v[1] << " " << v[2] << " " << v[3] << endl;//2 3 1 4
    
    cout << v.front() << " " << v.back() << endl;//2 4
    
    reverse(v.begin(),v.end());//逆序输出
    for (int i = 0;i < v.size();i++) cout << v[i] << " ";//4 1 3 2
    cout << endl;
    
    v.pop_back();//删除最后一个元素
    print(v);//4 1 3
    
    vector<int> v2(4);//定义一个长度为4的空容器
    print(v2);//0 0 0 0
    vector<int> v3(4,10);//定义一个长度为4,元素全为10的容器
    print(v3);//10 10 10 10
    
    v3.insert(v3.begin(),3);//在v3的开头插入1个3
    print(v3);//3,10 10 10 10
    v3.insert(v3.begin(),2,3);//在v3的开头插入2个3
    print(v3);//3,3,3,10 10 10 10
    v3.erase(v3.begin());//删除v3的第一个元素
    print(v3);//3 3 10 10 10 10 
    
    return 0;
}

以上代码的输出结果:

0
4
2 3 1 4
2 3 1 4
2 4
4 1 3 2
4 1 3
0 0 0 0
10 10 10 10
3 10 10 10 10
3 3 3 10 10 10 10
3 3 10 10 10 10

复制、swap、sort、reverse
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>
#include <string>

using namespace std;

void print(vector<int> v)//打印函数
{
    for (int i = 0;i < v.size();i++) cout << v[i] << " ";
    cout << endl;
}

int main()
{
    int a1[5] = {0,1,2,3,4};
    int a2[5] = {5,6,7,8,9};
    int a3[5] = {2,4,1,5,3};
    
    vector<int> v1(a1,a1 + 5);//将数组a1复制到容器v1中
    vector<int> v2(a2,a2 + 5);//将数组a2复制到容器v2中
    vector<int> v3(a3,a3 + 5);//将数组a3复制到容器v3中
    
    print(v1);//0 1 2 3 4  
    print(v2);//5 6 7 8 9
    swap(v1,v2);//交换两个容器的数据
    print(v1);//5 6 7 8 9 
    print(v2);//0 1 2 3 4 
    
    print(v3);//2 4 1 5 3 
    reverse(v3.begin(),v3.end());//倒着输出v3,不排序
    print(v3);//3 5 1 4 2
    
    sort(v3.begin(),v3.end());//对v3排序
    print(v3);//1 2 3 4 5
    
    return 0;
}
二维vector
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>
#include <string>

using namespace std;

int main()
{
    vector<vector<int>> v(15);//vector里面开vector -> 二维vector
    
    for (int i = 0;i < 10;i++)//10列
        for (int j = 0;j < 10;j++)//10行
            v[i].push_back(1);
            
    for (int i = 0;i < 10;i++)
    {
        for (int j = 0;j < 10;j++)
        {
            cout << v[i][j] << " ";
        }
        cout << endl;
    }
    
    return 0;
}

输出:

1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1

迭代器

迭代器类似于指针,是用来指向、修改、遍历容器元素的变量。其使用方法也类似指针。下面是使用指针遍历字符数组的写法:

#include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>
#include <string>

using namespace std;

int main()
{
    char s[] = "hello world";
    char *p;//字符类型的指针
    
    for (p = s;*p != '\0';p++) cout << *p;//hello world
    return 0;
}

类似指针,使用下面的写法遍历容器:

#include <iostream>
#include <vector>

using namespace std;

int main()
{
    int a[5] = {1,2,3,4,5};
    vector<int> v(a,a + 5);
    vector<int>::iterator it;//迭代器
    for (it = v.begin();it != v.end();it++)
    {
        cout << *it << " ";//1 2 3 4 5 
    }
    return 0;
}
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值