STL容器基本用法

目录

一:Vector 向量

二:List 链表

三:Map 图

四:Set 集合

五:Stack 栈

六:Queue 队列

七: Double Ended Queues(双向队列)

八:Priority Queues(优先队列)


一:Vector 向量

Vector 包含着一系列连续存储的元素,其行为和数组类似。

访问Vector中的任意元素(随机访问)或从末尾添加元素都可以在常量级时间复杂度内完成,而查找特定值的元素所处的位置(find)或是在Vector中插入元素(insert)则是线性时间复杂度。

1:声明和初始化

vector<int> a;
vector<int> a(10);    //为vector分配十个空间,默认值都为0
vector<int> a(10, 1); //十个默认值均为1
vector<int> b(a);     //用a初始化b
vector<int> b(a.begin(), a.begin()+3);    //用a的前三个元素初始化b

//assign()
vector<int> c;
c.assign(a.begin(), a.end());    //assign初始化,用a初始化c
c.assign(10,1);    //十个值为1


//用数组
int arr[5] = {1,2,3,4,5};
vector<int> a(arr, arr+n);    //用数组前n个元素初始化a

2:遍历方式

//方式1
int arr[] = {1,2,3};
vector<int> a(arr, arr+3);

for(int i = 0; i < a.size(); i++) {
    cout << a[i] << ' ';
}

//方式2,迭代器
for(vector<int>::iterator it=a.begin(); it!=a.end(); it++) {
    cout << *it << ' ';
}

3:常用函数

  • size()                                                    返回容器容量
  • clear()                                                   清空容器
  • empty()                                                 返回容器是否为空
  • push_back()                                         向容器末尾插入一个元素
  • pop_back()                                           删除容器最后一个元素,返回空
  • front()                                                   返回容器第一个元素
  • back()                                                  返回容器最后一个元素
  • begin()                                                 返回第一个元素的迭代器
  • end()                                                    返回最末元素的迭代器(译注:实指向最末元素的下一个位置)
  • rbegin()                                                返回vector尾部的逆迭代器
  • rend()                                                   返回vector起始的逆迭代器
  • swap()                                                  交换两个向量的元素
  • insert()                                                插入元素,比较重要,有三种用法

1:iterator insert( iterator loc, const TYPE &val );

在指定位置loc前插入值为val的元素,返回指向这个元素的迭代器。

int arr[] = {1,2,3};
vector<int> vec(arr, arr+3);

auto it = vec.insert(vec.begin(), 10);
cout << *it << endl;

for(it = vec.begin(); it!=vec.end(); it++)
    cout << *it << endl;


//输出 
10
10
1
2
3

2:void insert( iterator loc, size_type num, const TYPE &val );

在指定位置loc前插入num个值为val的元素

int arr[] = {1,2,3};
vector<int> vec(arr, arr+3);

vec.insert(vec.begin(), 3, 1);
for(auto it = vec.begin(); it!=vec.end(); it++)
	cout << *it << endl;


//输出
1
1
1
1
2
3

3: void insert( iterator loc, input_iterator start, input_iterator end);

在指定位置loc前插入区间[start, end)的所有元素

int arr[] = {1,2,3};
vector<int> vec(arr, arr+3);

vector<int> vv(3, 5);

vec.insert(vec.begin(), vv.begin(), vv.end());
for(auto it = vec.begin(); it!=vec.end(); it++)
	cout << *it << endl;


//输出
5
5
5
1
2
3
  • erase()                                               删除指定元素,常用

1:iterator erase( iterator loc );

    删除指定元素位置loc的元素,返回loc后元素

2:iterator erase( iterator start, iterator end );

    删除[start, end)区间的元素,返回end下一个元素

int arr[] = {1,2,3,4};
vector<int> vec(arr, arr+4);
auto it = vec.erase(vec.begin());
cout << *it << endl;

it = vec.erase(vec.begin(), vec.begin()+2);
cout << *it << endl;

//输出
2
4

在使用迭代器遍历过程中删除元素要注意迭代器会失效。

二:List 链表

不支持随机访问,允许快速的插入和删除。

List将元素按顺序储存在链表中. 与向量(vector)相比, 它允许快速的插入和删除,但是随机访问却比较慢。

1:声明和初始化

和vector基本相同

2:遍历

只能使用迭代器遍历!!

3:常用函数:

  • begin()                                                 返回第一个迭代器
  • end()                                                    返回末尾的迭代器
  • rbegin()                                                返回指向第一个元素的逆迭代器
  • rend()                                                   返回指向末尾的逆迭代器
  • front()                                                   返回第一个元素
  • clear()                                                  清空容器
  • empty()                                                返回容器是否为空
  • size()                                                   返回元素个数
  • push_back()                                        末尾插入一个元素
  • push_front()                                         头部插入一个元素
  • pop_back()                                          删除最后一个元素
  • pop_front()                                           删除第一个元素
  • swap()                                                  交换两个链表的元素
  • remove()                                              删除所有指定元素
  • remove_if()                                          按指定条件删除元素
//条件函数
bool condition(int i) {
	return i==1;
}

int main() {
    // freopen("i.txt", "r", stdin);
    // freopen("o.txt", "w", stdout);
    int arr[] = {1,2,3,4,1,1};
    list<int> l(arr, arr+4);

    l.remove_if(condition);    //等同于l.remove(1);
    for(auto it=l.begin(); it!=l.end(); it++)
    	cout << *it << endl;

//输出
2
3
4
  • reverse()                                                逆转链表
  • unique()                                                 删除链表中重复的元素
  • sort()                                                      链表排序(以上为list自带,无参数)
  • merge()                                                  合并两个链表
int arr[] = {1,2,3,4};
list<int> l(arr, arr+4);

list<int> ll(2,9);
l.merge(ll);
for(auto it=l.begin(); it!=l.end(); it++)
	cout << *it << endl;


//输出
1
2
3
4
9
9
  • splice()                                                   合并两个链表

1:void splice( iterator pos, list &lst );

    把lst链表连接到pos的位置。

2:void splice( iterator pos, list &lst, iterator del );

    把lst链表del位置的元素插入到pos位置

3:void splice( iterator pos, list &lst, iterator start, iterator end );

    把lst链表[start, end)区间内元素插入到pos位置

三:Map 图

C++ Maps是一种关联式容器,包含“关键字/值”对

1:声明和初始化

//map有多个构造函数

map<string, string> map1;
//最常用
map["map1"] = "c++";

//拷贝
map<string, string> map2(map1);

map<string, string> map3(map1.begin(), map1.end());

2:遍历方式

map<string, string> map1;
map1["c++"] = "a";
map2["cpp"] = "b";

for(map<string,string)::iterator it=map1.beging(); it!=map1.end(); it++) {
    // map的迭代器,可以用 first 访问std::pair的第一个成员,second 访问第二个成员
    cout << it->first << " " << it->second << endl;
}

3:常用函数

  • begin(),end()                                                 返回指向map头部,尾部的迭代器
  • rbegin(),rend()                                              返回指向map尾部,头部的逆向迭代器
  • clear()                                                              删除所有元素
  • count()                                                             返回指定元素出现的个数
  • empt()                                                              如果为空返回true
  • size()                                                               返回元素个数
  • find()                                                               返回一个指向键值为key的迭代器,如果没找到就返回指向map尾部的迭代器
map<string, string> map1;
map1["map1"] = "1";
map1["map2"] = "2";
map1["map3"] = "3";

map<string, string>::iterator it = map1.find("map1");
cout << it->first << " " << it->second << endl;
map<string, string>::iterator it2 = map1.find("1");
cout << (it2==map1.end()) << endl;

//输出
map1 1
1
  • lower_bound()                                    返回键值>=给定元素的第一个位置

  • upper_bound()                                    返回键值>给定元素的第一个位置

map<string, string> map1;
map1["map1"] = "1";
map1["map2"] = "2";
map1["map3"] = "3";

map<string, string>::iterator it = map1.lower_bound("map2");
cout << it->first << " " << it->second << endl;
it = map1.upper_bound("m");
cout << it->first << " " << it->second << endl;


//输出
map2 2
map1 1
  • insert()                                               插入

1:iterator insert( iterator pos, const pair<KEY_TYPE, VALUE_TYPE > &val );

    插入val到pos的后面,然后返回一个指向这个元素的迭代器

    在map中无作用,因为map会自动排序

2:void insert( input_iterator start, input_iterator end );

    插入start到end的元素到map中

3:pair<iterator, bool> insert( const pair<KEY_TYPE, VALUE_TYPE> &val  )

    只有在val不存在时插入val。返回值是一个指向被插入元素的迭代器和一个描述是否插入的bool值

map<string, string> map1;
map1["bbb"] = "1";
map1["aaa"] = "2";
    
pair<map<string, string>::iterator, bool> it = map1.insert(make_pair<string, string>("ccc", "2"));
map<string, string>::iterator itt = it.first;
cout << itt->first << " " << itt->second << endl;
cout << it.second << endl;


//输出
ccc 2
1
  • erase()                                                      删除元素

都会使迭代器失效

1:void erase( iterator pos );

    删除指定位置元素

2:void erase( iterator start, iterator end );

    删除[start, end)元素

3:size_type erase( const KEY_TYPE &key);

   删除键值为key的元素,返回个数

四:Set 集合

集合(Set)是一种包含已排序对象的关联容器

一:遍历方式

迭代器遍历

二:常用函数

  • begin(),end()                                                 返回指向set头部,尾部的迭代器
  • rbegin(),rend()                                              返回指向set尾部,头部的逆向迭代器
  • clear()                                                              删除所有元素
  • count()                                                             返回指定元素出现的个数
  • empt()                                                              如果为空返回true
  • size()                                                               返回元素个数
  • lower_bound()                                               返回键值>=给定元素的第一个位置
  • upper_bound()                                               返回键值>给定元素的第一个位置
  • find()                                                               返回一个指向键值为key的迭代器,如果没找到就返回指向set尾部的迭代器
  • insert()                                                            插入元素

1:iterator insert( iterator pos, const TYPE &val );

    插入val到pos的后面,然后返回一个指向这个元素的迭代器

    在set中无作用,因为set会自动排序

2:void insert( input_iterator start, input_iterator end );

    插入start到end的元素到set中

3:pair<iterator, bool> insert( const TYPE &val )

    只有在val不存在时插入val。返回值是一个指向被插入元素的迭代器和一个描述是否插入的bool值

  • erase()                                                         删除元素

都会使迭代器失效

1:void erase( iterator pos );

    删除指定位置元素

2:void erase( iterator start, iterator end );

    删除[start, end)元素

3:size_type erase( const KEY_TYPE &key);

   删除键值为key的元素,返回个数

五:Stack 栈

C++ Stack(堆栈) 是一个容器类的改编,为程序员提供了堆栈的全部功能,——也就是说实现了一个先进后出(FILO)的数据结构。

empty()堆栈为空则返回真
pop()移除栈顶元素
push()在栈顶增加元素
size()返回栈中元素数目
top()返回栈顶元素

六:Queue 队列

C++队列是一种容器适配器,它给予程序员一种先进先出(FIFO)的数据结构。

back()返回最后一个元素
empty()如果队列空则返回真
front()返回第一个元素
pop()删除第一个元素
push()在末尾加入一个元素
size()返回队列中元素的个数

七: Double Ended Queues(双向队列)

双向队列和向量很相似,但是它允许在容器头部快速插入和删除(就像在尾部一样)。

比向量相比(其他均相同):

pop_back()删除尾部的元素
pop_front()删除头部的元素
push_back()在尾部加入一个元素
push_front()在头部加入一个元素

八:Priority Queues(优先队列)

empty()如果优先队列为空,则返回真
pop()删除第一个元素
push()加入一个元素
size()返回优先队列中拥有的元素的个数
top()返回优先队列中有最高优先级的元素
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值