STL容器之vector、set、map

vector

简介

  • vector是STL的动态数组,在运行时能改变数组大小,能存放任何类型的对象。

一、定义:

1.定义int型数组:

  1. vector<int> a;默认初始化,a为空。
  2. vector<int> b(a);用a来定义b。
  3. vector<int> a(100);有100个值为0的元素。
  4. vector<int> a(100,6);有100个值为6的元素。

2.定义string型数组:

  1. vector<string> a(10,"null");有10个值为null的元素。
  2. vector<string> vec(10,"hello");有10个值为hello的元素。

3.定义结构体型数组:

  1. cpp struct point{int x,y;}; vector<point>a;用a来储存坐标。

4.定义二维数组,及其相关操作:

  1. 定义一个二维数组:vector<vector<int>> a;
  2. 将二维数组中的数变成m:a.resize(m);
  3. 将二维数组中的数变成m:
for (int i = 1; i <= m; i++)
    a[i].resize(n);
  1. 给二维数组赋值:
for (int i = 1; i <= m; i++)
        for (int j = 1; j <= n; j++)
            cin >> a[i][j];

二、常用操作:

  1. 赋值(尾部插入):a.push_back(100);在尾部添加元素100。
  2. 元素个数:a.size();
  3. 是否为空:a.empty();
  4. 中间插入:a.insert(a.begin() + i, k);在第i个元素前面插入k。
  5. 尾部插入:a.insert(a.end(), 10, 5);在尾部插入10个值为5的元素。
  6. 删除尾部:a.pop_back();删除末尾元素。
  7. 删除区间:a.erase(a.begin() + i, a.begin() + j);删除区间[i,j-1]的元素。
  8. 删除元素:a.erase(a.begin()+2);删除第3个元素。
  9. 清空:a.clear();
  10. 翻转:reverse(a.begin(), a.end());
  11. 排序:sort(a.begin(), a.end());
  12. 调整大小:a.resize(n);数组大小变为n;

hdu 4841圆桌问题

#include <bits/stdc++.h>
using namespace std;
int main()
{
    ios::sync_with_stdio(false);
    int n, m;
    vector<int> table;
    while (cin >> n >> m)
    {
        table.clear();
        for (int i = 0; i < 2 * n; i++)
            table.push_back(i);
        int pos = 0; //t走的人的位置
        for (int i = 0; i < 2 * n; i++)
        {
            pos = (pos + m - 1) % table.size();
            table.erase(table.begin() + pos);
            if(table.size()==n)
                break;
        }
        int j = 0;
        for (int i = 0; i < 2 * n; i++)
        {
            if (!(i % 50) && i)
                cout << endl;
            if (i == table[j] && j < table.size())
            {
                j++;
                cout << "G";
            }
            else
                cout << "B";
        }
        cout << endl
             << endl;
    }
    return 0;
}

set

一、简介

  • set是用二叉搜索树实现,集合中的每个元素只出现一次
  • set在建立映射的同时,会自动实现按照键从小到大排序

二、定义、相关操作

  1. 定义:set<Type> A;定义Type类型的set。
  2. 存放item:A.insert(item);
  3. 删除item:A.erase(item);
  4. 清空set: A.clear();
  5. 判断是否为空:A.empty();
  6. 返回元素个数:A.size();
  7. 返回一个迭代器,指向键值k:A.find(k);
  8. 返回一个迭代器,指向键值大于等于k的第一个元素:A.lower_bound(k);
  9. 返回一个迭代器,指向键值大于k的第一个元素:A.upper_bound(k);

hdu 2094

map

简介

  • map容器可以快速地实现查找。
  • map在建立映射的同时,会自动实现按照键从小到大排序

map的具体操作:

例题:现有n个学生,每人有姓名name,学号id,现在给定一个学生的name,要求查找他的id。

#include <bits/stdc++.h>
using namespace std;
int main()
{
    ios::sync_with_stdio(false);
    map<string, int> student; //定义
    string name, stu;
    int id, n;
    cin >> n; //有n个学生
    while (n--)
    {
        cin >> name >> id;  //输入名字和id
        student[name] = id; //将两者关联
    }
    cin >> stu;                   //输入要查找的学生
    cout << student[stu] << endl; //输出id
    return 0;
}

一、常用操作:

1.插入:

方法一:pair

map<int, int> mp;//定义
mp.insert(pair<int,int>(1, 2));//插入1,2

方法二:make_pair

map<int, int> mp;
mp.insert(make_pair<int,int>(2,3));

方法三:value_type

map<int, int> mp;
mp.insert(map<int, int>::value_type(3,4));

方法四:[]

map<int, int> mp;
mp[4] = 5;

前三种方法不能出现重复键,第四种方法,若出现重复键会将其覆盖。


2.查找:

方法一:[]

	map<int, int> xx;
    xx[1] = 3;
    cout << xx[1] << endl;//输出3
    cout << xx[2] << endl;//输出0

若在map中没有该键位,则输出0。
在这里插入图片描述
方法二:map.at()

	map<int, int> xx;
    xx[1] = 3;
    cout << xx.at(1) << endl;
    cout << xx.at(2) << endl;
    return 0;

在这里插入图片描述
方法三:count()
map::count(k),返回map中k出现的次数,为0当然就表示不存在,只能用来判断k是否存在。

3、删除

方法一:删除单个键

	xx.erase(key);

方法二:通过迭代器删除

	map<int,string>::iterator iter=xx.find(key);
    xx.erase(iter);

方法三:删除两个迭代器所指向的范围 [,)左闭右开区间

	map<int,string>::iterator itera=xx.find(6);
    iter=xx.find(4);
    xx.erase(iter,itera);

方法四:删除全部

	xx.erase(xx.begin(),xx.end());
	xx.clear();

4、遍历

方法一:前序遍历 [ begin(), end() )

map<int, int> xx;
for(map<int, int>::iterator iter = xx.begin();iter != xx.end(); iter++)
	cout << xx->first << " " << xx->second << endl;

方法二:后序遍历 [ rbegin(), rend() )

map<int,string> xx;
for(map<int, int>::iterator iter = xx.rbegin();iter != xx.rend();iter++)
	cout << xx->first << " " << xx->second << endl;

5、自定义结构体排序

需要对结构体进行重载,一下有两种方式,切记他的排序方式与sort对结构体排序完全相同优先队列的与sort的完全相反的。
第一种:

struct people
{
    int num;
    int x;
};
bool operator <(const people &a,const people &b)
{
        return a.x>b.x;
};

第二种:
仅仅是比第一种多了个friend并且移动到结构体上。

struct people
{
    int num;
    int x;
    friend bool operator <(const people &a,const people &b)
    {
        return a.x>b.x;
    }
};

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 C++ STL 中,vector、list、mapset 都是常用的容器,它们各自有不同的特点和适用场景。下面简要介绍一下它们的特点和使用场景,以帮助你选择合适的容器: 1. vector vector 是一个动态数组,它具有随机访问、高效的尾部插入和删除等优点。由于其底层实现是连续的内存空间,因此在插入或删除元素时可能需要移动大量的元素,这可能导致性能下降。因此,vector 适用于需要随机访问元素,并且插入和删除操作不频繁的场景。 2. list list 是一个双向链表,它具有高效的插入和删除操作,但是不支持随机访问。由于其底层实现是链表,因此在插入或删除元素时只需要修改节点的指针,不需要移动元素,因此插入和删除操作非常高效。因此,list 适用于需要频繁插入和删除元素,并且不需要随机访问元素的场景。 3. map map 是一个关联容器,它使用红黑树实现,支持按关键字排序。由于其底层实现是红黑树,因此在查找元素时非常高效,时间复杂度为 O(log n)。因此,map 适用于需要按关键字排序,并且需要快速查找元素的场景。 4. set set 是一个关联容器,它使用红黑树实现,支持按值排序。由于其底层实现是红黑树,因此在查找元素时非常高效,时间复杂度为 O(log n)。因此,set 适用于需要按值排序,并且需要快速查找元素的场景。 总之,选择合适的容器取决于你的具体需求。如果需要随机访问元素,并且插入和删除操作不频繁,应该选择 vector;如果需要频繁插入和删除元素,并且不需要随机访问元素,应该选择 list;如果需要按关键字排序,并且需要快速查找元素,应该选择 map;如果需要按值排序,并且需要快速查找元素,应该选择 set

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值