C++标准模板库(STL)常见容器的用法

STL常见容器的用法

    • 一. vector
        • 定义
        • 访问元素
        • 常见函数
    • 二. set
        • 定义
        • 访问元素
        • 常用函数
    • 三. string
        • 初始化
        • 访问元素
        • 常用函数
    • 四. map
        • 定义
        • 访问
        • 常用函数
    • 五. queue
        • 定义
        • 访问
        • 常用函数
    • 六. stack
        • 访问
        • 常用函数
    • 七. pair
        • 定义
        • 访问
        • 常用函数
        • 用途

代码来源:晴神《算法笔记》!!

一. vector

特点:变长数组

使用vector,需要添加vector头文件,并写上using namespace std; 其他容器类似,都需要添加相应的头文件,不再赘述。

定义

vector name;

typename可以是任何基本类型,也可以是STL标准容器。注意,如果容器套容器,两个>之间应当加上空格,如下:

vector > name;

vector数组的定义方法:

vector arrayname[size];

与上一种写法不同的是,这种写法的一维长度已经固定。

访问元素

  1. 通过下标
    v[index]
  2. 通过迭代器

迭代器类似于指针,定义方式如下:

vector::iterator it; 

通过*it即可访问vector中的元素。

v[i]和 *(v.begin() + i)是等价的,需要注意的是,在常见STL容器中,只有vector和string支持v.begin()+3这种迭代器加上整数的写法。

另外,迭代器支持自加自减操作。

常见函数

  • push_back()和pop_back()
  • size()
  • clear()
  • insert()
v.insert(it, x);   //it是迭代器
  • erase()
//删除单个元素
v.erase(it);   //it是迭代器
v.erase(v.begin() + 3)

//删除一个区间内元素
v.erase(v.begin() + 1, v.begin() + 3);   //左闭右开区间
  • begin()和end()

    不支持it < v.end()这种写法,应当写成it != v.end()

    注意,v.end()指向尾元素地址的下一个地址。

  • vector本身没有find()

    需要依靠algorithm头文件实现。

vector::iterator it = find(v.begin(), v.end(), 3);

二. set

特点:内部自动有序,且不含重复元素

定义

与vector类似,略

访问元素

只支持迭代器*it访问,不支持下标访问,也不支持 *(it + 3)。

常用函数

  • insert(x)
    自动排序和去重。

  • find()
    s.find(value)返回值为value的迭代器。

  • erase()

//删除单个元素的两种方法:
s.erase(it);     //it为迭代器,如s.erase(s.find(2));
s.erase(value); 

//删除一个区间内的元素
s.erase(first,last);    //first和end为迭代器
  • size()
  • clear()

三. string

可以用cin,cout,getline等输入输出。若想使用printf,可以先用c_str()转化为字符串:

printf("%s", str.c_str());

若想使用scanf可以采用如下写法:

string str;
str.resize(100);
scanf("%s",&str[0]);

初始化

string str = "abcd";

访问元素

  • 通过下标
  • 通过迭代器
    string::iterator it;

常用函数

  • +和+=
    可实现两个string拼接。
  • == != < <= > >=
    根据字典序。
  • length()和size()
  • insert()
str.insert(pos, string);      //在pos位置插入字符串string

str.insert(it, it2, it3);     //it为原字符串欲插入位置,it2和it3位待插字符串的首尾迭代器(左闭右开)
  • erase()
//删除单个元素
str.erase(it);

//一个区间
str.erase(first, last);
str.erase(pos,length);   //如str.erase(3, 2);
  • clear()
  • substr(pos, len)
    返回从pos位开始,长度为len的子串。
  • string::npos
    是一个常数,可用作find失败时的返回值。
  • find()
str.find(str2);    //当str2是子串时,返回第一次出现的pos,否则返回string::npos

str.find(str2, pos);  //从pos位开始匹配str2
  1. replace()
str.replace(pos, len, str2);    //从pos开始长度为len的子串替换为str2
str.replace(it1, it2, str2);       // [it1, it2)范围内的子串替换为str2

四. map

定义

如果是字符串到整型的映射,必须使用string而不能使用char数组。

map的键和值也可以是STL容器。

map mp;

访问

  1. 下标
    map中的键是唯一的,mp[‘c’]可访问c对应的值。

  2. 迭代器
    map可使用it->firsrt来访问键,it->second访问值。

    map会以键从小到大的顺序自动排序。

常用函数

  • find(key)
    返回迭代器。
  • erase()
//删除单个元素
mp.erase(it);
mp.erase(key);

//一个区间
mp.erase(first, last);
  • size()
  • clear()

五. queue

定义

queue q;

访问

只能通过front()访问队首元素,通过back()访问队尾元素。

常用函数

  • front()和back()
  • pop()
  • push()
  • empty()
  • size()

六. stack

访问

只能通过top()访问栈顶元素。

常用函数

  • push()
  • pop()
  • empty()
  • top()
  • size()

七. pair

pair可以看作一个包含两个元素的结构体。

需要添加头文件utility,因为map的内部实现涉及pair,因此只添加map也可以。

定义

pair p;  

//可通过以下写法初始化 
pair p("haha",5); 

//临时创建一个pair
pair("haha",5);
make_pair("haha",5); 

访问

类似于结构体的访问“.”,pair中有两个元素,分别是first和second。

pair p;
p.first = "haha";
p.second = 5;

p = make_pair("haha",5);
p = pair("haha",5);

常用函数

  • == != < <= > >=
    先比较first,当first相等时,比较second。

用途

  • 可以代替二元结构体
  • 可以作为map的键值对进行插入
mp.insert(make_pair("haha", 5));
mp.insert(pair("haha", 5));

你可能感兴趣的:(算法笔记)