STL及一些常用函数的基本用法

1.vector(向量)的基本用法

vector是C++的STL中一个常见的容器,使用时需要加上#include\的头文件,其可以动态储存数据,既可以很方便的实现插入,删除等基本操作,其基本语法如下:

#include<bits/stdc++.h>

using namespace std;

int main()
{
vector<int> a;
for(int i=0;i<10;i++)
a.push_back(i); //push_back can add data in the end of vector
int len=a.size(); //a.size() can return the length of vector,a.begin() return the first data's address,and a.end() is return last.
cout<<len<<endl;
a.insert(a.begin()+len,10); //insert a data in the len-th
a.erase(a.end()); //delete a end data of vector
a.pop_back(); //pop the last data
if(a.empty()) //judge whether this vector is empty
cout<<"The vector is empty!"<<endl;
//a.reverse(a.begin(),a.end()); //reverse all the data.
sort(a.begin(),a.end()); //sort the data from begin to the end of vector,can also add cmp function
vector<int>::iterator it;
for(it=a.begin();it<=a.end();it++) cout<<*it<<" ";
cout<<endl; //ergodic all the datas of vector
/*you can also use this operation to ergodic the data of vector
for(vector<int>::size_type i=0;i<=a.size();i++) cout<<a[i]<<" ";
cout<<endl;
*/
a.clear(); //clear all the datas of the vector
return 0;
}

2.queue(队列)的基本用法

队列是C++STL中一个常见的容器,其具有先进先出的特点,在使用时要加#include\的头文件,其基本语法如下:

#include<iostream>
#include<queue> using namespace std; int main()
{
queue<int> myqueue; //定义队列
for(int i=1;i<=5;i++)
myqueue.push(i); //将i压入队列的底部(末端)
cout<<myqueue.size()<<endl; //返回queue的长度
cout<<myqueue.front()<<endl; //返回队列的第一个元素(也就是最先进入队列的元素,不会删除这个元素)
if(myqueue.empty()) //判断这个queue中是否有元素(队列是否为空)
cout<<"The queue is empty!"<<endl;
myqueue.pop(); //删除第一个元素
cout<<myqueue.front()<<endl;
cout<<myqueue.back()<<endl; //返回queue的最后一个元素并将它输出出来(不删除)
return 0;
}

3.stack(栈)的基本操作

栈也是C++的STL中一种常见的容器,其使用时要加头文件#include\,是一种先进后出或者说后进先出的容器,其基本语法如下:

#include<iostream>
#include<stack> using namespace std; int main()
{
stack<int> mystack;
if(mystack.empty()) //判断这个stack是否为空,如果为空,则返回1
cout<<"The stack is empty!"<<endl;
for(int i=1;i<=5;i++)
mystack.push(i); //将元素push入stack中
cout<<mystack.size()<<endl; //返回这个栈的length
cout<<mystack.top()<<endl; //输出栈顶元素(最后加入的元素,不删除元素)
mystack.pop(); //弹出栈顶的元素(删除栈顶元素)
while(!mystack.empty()) //逆序遍历栈,但是栈的元素全部被删除
{
cout<<mystack.top()<<" ";
mystack.pop();
}
return 0; }

4.set(集合)的基本用法

set是C++STL标准模板库的一个常用模板,其可以对里面的元素自动按升序排序,并去掉重复元素。其内部原理是红黑树,其基本语法如下:

#include<iostream>
#include<set> using namespace std; int main()
{
set<int> myset; //初始化定义一个set
myset.insert(3); //向set中插入元素,注意set中没有Push这一成员函数,只能insert
myset.insert(6);
myset.insert(1);
myset.insert(10);
myset.insert(8);
myset.insert(3);
cout<<myset.size()<<endl; //返回set的大小
for(set<int>::iterator it=myset.begin();it!=myset.end();it++)
cout<<*it<<" ";
cout<<endl;
set<int>::iterator it=myset.find(3); //查找元素,返回元素所在的迭代器
cout<<*it<<endl; //要注意,虽然it是set的迭代器,但是并不支持it<myset.end()的写法
myset.erase(myset.find(1)); //删除元素,注意里面的参数是迭代器
myset.erase(3); //也可以把要删除的值直接做参数传入set的erase中
myset.erase(it,myset.end()); //区间删除,从it迭代器到末尾的元素全部删除
myset.clear(); //清空集合
return 0;
}

5.map(映射)的基本用法

Map是c++的一个标准容器,她提供了很好一对一的关系,在一些程序中建立一个map可以起到事半功倍的效果,使用时需包含头文件#include<map>下面是map的一些基本操作:

#include<iostream>
#include<utility>
#include<map>
#include<string> using namespace std; int main()
{
map<string,int> mymap,map1,map2; //定义map变量
map<string,int>::iterator it; //map的迭代器
//向map变量中添加元素
mymap.insert(pair<string,int>("a",1));
mymap.insert(pair<string,int>("c",3));
mymap.insert(pair<string,int>("b",2));
mymap.insert(pair<string,int>("d",4));
mymap.insert(pair<string,int>("e",5));
mymap.insert(pair<string,int>("f",6));
mymap["g"]=7;
//map的查找,注意,我们通过map的键查找
it=mymap.find("g");
if(it==mymap.end()) cout<<"We haven't find the key!"<<endl;
else
cout<<it->first<<" "<<it->second<<endl; //键对应first,值对应second
//map元素的删除
it=mymap.find("d");
if(it==mymap.end())
cout<<"We haven't find the key!"<<endl;
else
mymap.erase(it); //删除迭代器,即删除这个元素
//map的遍历
map<string,int>::iterator it1;
for(it1=mymap.begin();it1!=mymap.end();it1++)
cout<<it1->first<<" "<<it1->second<<endl;
//map的swap操作
//注意,map中的swap不是一个元素之间的交换,而是map两个容器之间的交换
map1.insert(pair<string,int>("be",1));
map2.insert(pair<string,int>("af",2));
map1.swap(map2);
map<string,int>::iterator it2;
for(it=map1.begin();it!=map1.end();it++)
cout<<it->first<<" "<<it->second<<endl;
//map的sort问题,map不能使用sort,因为map默认将插入的元素按照键的从小到大顺序排列
cout<<mymap.size()<<endl; //返回map的迭代器数目
/*
以下为map的一些常见子函数
begin()          返回指向map头部的迭代器
    clear()         删除所有元素
    count()          返回指定元素出现的次数
    empty()          如果map为空则返回true
    end()            返回指向map末尾的迭代器
    equal_range()    返回特殊条目的迭代器对
    erase()          删除一个元素
find()           查找一个元素
    get_allocator()  返回map的配置器
    insert()         插入元素
    key_comp()       返回比较元素key的函数
    lower_bound()    返回键值>=给定元素的第一个位置
    max_size()       返回可以容纳的最大元素个数
    rbegin()         返回一个指向map尾部的逆向迭代器
    rend()           返回一个指向map头部的逆向迭代器
    size()           返回map中元素的个数
    swap()            交换两个map
    upper_bound()     返回键值>给定元素的第一个位置
    value_comp()      返回比较元素value的函数*/
return 0;
}

6.unorded_map的用法

unordered_map也是stl的容器之一,不过它与map的不同之处在于:unordered_map使用哈希的方式储存,所以其查找的效率能达到\(O(1)\)的效果,下面是其及基本用法:

#include <unordered_map>
#include <string>
#include <iostream> using namespace std;
unordered_map<string,double> m; int main() {
m.insert(make_pair("PI", 3.14));
m["root2"] = 1.414;
m["root3"] = 1.732;
m["log10"] = 2.302;
m["loge"] = 1.0; //插入值
m.insert(make_pair("e", 2.718));
string key = "PI"; if (m.find(key) == m.end()) //没找到
cout << key << " not found\n\n";
else cout << "Found " << key << "\n\n";
//cout << m["Pi"] << endl; 是可行的 unordered_map<string, double>::iterator it;
for (it = m.begin(); it != m.end(); it++) //遍历元素
cout << it->first << " " << it->second << endl;
system("pause");
return 0;
}

7.list(列表)的基本用法

list是一种序列式容器。list容器完成的功能实际上和数据结构中的双向链表是极其相似的,list中的数据元素是通过链表指针串连成逻辑意义上的线性表,也就是list也具有链表的主要优点,即:在链表的任一位置进行元素的插入、删除操作都是快速的。在使用list时需加头文件#include,其基本语法如下:

#include<iostream>
#include<list> using namespace std; int main()
{
list<int> mylist,mylist2;
for(int i=1; i<=5; i++)
mylist.push_back(i); //尾插法
mylist.push_front(0); //头插法
if(mylist.empty())
cout<<"The list is empty!"<<endl;
cout<<mylist.size()<<endl;
mylist.insert(mylist.end(),6); //插入元素
mylist2.insert(mylist2.begin(),10);
mylist.erase(mylist.begin()); //删除某一个元素
//mylist.erase(mylist.begin(),mylist.end()); 删除某一个区间的元素
list<int>::iterator it; //list的迭代器
cout<<"Before swap:"<<endl;
for(it=mylist.begin(); it!=mylist.end(); it++)
cout<<*it<<" "; //list的遍历
cout<<endl;
mylist.pop_front(); //删除第一个list元素,pop_back(),删除最后一个元素
mylist.resize(7); //重新设置list的最大长度,超出范围的将会被删除
mylist.swap(mylist2);
cout<<"After swap:"<<endl;
for(it=mylist.begin();it!=mylist.end();it++)
cout<<*it<<" ";
cout<<endl;
mylist.merge(mylist2); //将mylist2归并到mylist中去
cout<<"After merge:"<<endl;
for(it=mylist.begin();it!=mylist.end();it++)
cout<<*it<<" ";
cout<<endl;
return 0;
}

7.next_premutation(全排列)的用法

next_permutation可以方便快捷的实现全排列

arr[5]={0,1,2,3,4};
sort(arr,arr+5);
do{
for(int i=0;i<5;++i)
cout<<arr[i]<<' ';
cout<<endl;
}while(next_permutation(arr,arr+5));
//注意,该库函数是按照字典序的顺序完成全排列的

8.stringstream的用法

stringstream可以对getline很好的进行分离:

string s,word;
getline(cin,s);
stringstream str(s);
while(str>>word)
cout<<word<<endl;

9.unique的用法

unique可以用来去重,该函数返回容器中不同元素的个数

//以下标为1开始的数组为例
int tot=unique(arr+1,arr+n+1)-(arr+1); //n为总元素个数
int tot=unique(vec.begin(),vec.end())-vec.begin(); //计算vector不同元素数量

10.lower_bound的用法

该函数可以计算指定位置第一个大于等于传入参数的元素的下标,前提是数组单调(如果还要求不重复的话可先用unique去个重,再sort一下就好了)

int pos=lower_bound(a+1,a+n+1,x)-a;	//数组下标从1开始
//在vector中也是类似
int val=*--upper_bound(vec.begin(),vec.end(),x); //返回第一个大于等于x的数值(假设一定存在)

11.string中的substr的用法

截取一个子字符串

#include <bits/stdc++.h>
using namespace std;
int main()
{
string x="Hello_World";
cout<<x.substr()<<endl; //cout<<"Hello_World"<<endl;
cout<<x.substr(5)<<endl; //截取x[5]到结尾,cout<<"_world"<<endl;
cout<<x.substr(0,5)<<endl; //以x[0]为始,向后截取5位(包含x[0])cout<<"Hello"<<endl;
/*指定的截取长度加起始位置即_off+_count>源字符串的长度,则子字符串将延续到源字符串的结尾*/
system("pause");
}

各种STL的基本用法的更多相关文章

  1. C++中的STL中map用法详解(转)

    原文地址: https://www.cnblogs.com/fnlingnzb-learner/p/5833051.html C++中的STL中map用法详解   Map是STL的一个关联容器,它提供 ...

  2. STL的其他用法(adjacent_find, find_first_of, sort_heap, merge, binary_search)总结

    2017-08-20 17:26:07 writer:pprp 1.adjacent_find() 下面是源码实现: template <class ForwardIterator> Fo ...

  3. C++-STL:vector用法总结

    目录 简介 用法 1. 头文件 2. vector的声明及初始化 3. vector基本操作 简介 vector,是同一类型的对象的集合,这一集合可看作可变大小的数组,是顺序容器的一种.相比于数组,应 ...

  4. STL中map用法

    Map是 STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力,由于 这个特性,它完成有可能在我们处理一对一数据的 ...

  5. [STL] SET实用用法

    背景 今天考试深受平衡树之害,可以参见上一篇博客,想到了set却苦于实用的不熟练.同时QTY询问set的具体用法,所以写这篇博客,同时留作自用. 分类 参看了一下网上其他set博客,上来都是长篇大论概 ...

  6. C++中的STL中map用法详解

    Map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据 处理能力,由于这个特性,它完成有可能在我们处理一对一数据的时 ...

  7. C++ STL sort()函数用法

    C++STL提供的在里的排序函数,有以下两种形式 此外还提供有稳定排序版本stable_sort(),用法类似. 第一种形式: template <class RandomAccessItera ...

  8. (转载) STL中map用法详解

    Map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力,由于这个特性,它完成有可能在我们处理一对一数据的时候 ...

  9. STL的常用用法、函数汇总(不定时更新)

    隶书文字为原创. 1.vector 在c++中,vector是一个十分有用的容器,下面对这个容器做一下总结. 1 基本操作 (1)头文件#include<vector>. (2)创建vec ...

  10. STL set 详细用法

    一个集合(set)是一个容器,它其中所包含的元素的值是唯一的. 用到的库 #include <set> 定义 最简单: set<int> a; set和其他的stl一样,都支持 ...

随机推荐

  1. jmeter实现SMTP邮件协议压测

    实现目的 通过jmeter的SMTP取样器,调用SMTP协议,批量进行邮件的发送,已达到压测的目的. 脚本实现 User Defined Variables定义用户变量 编辑SMTP Sampler取 ...

  2. jmeter实现一次登录,多次业务请求(不同线程组间共享cookie和变量)

    实现目的 很多时候,在进行性能测试时,需要先登录,然后再对需求的事务进行相关性能测试,此时的登录操作,并不在本次性能测试的范围内,所以我们只需要登录一次,然后获取登录成功后的cookie等,并将coo ...

  3. 6_15 给任务排序(UVa10305)<拓扑排序>

    John有n件事情要做,不幸的是这些事情并不是各自独立的,而是有相依性的.换句话说可能有某件事情一定要在另一件事情做完之后才能做.Input每组测试数据可能有好几列.第一列有2个整数n,m.(1 &l ...

  4. IIS-简介

    参考:https://www.jb51.net/article/85909.htm IIS是什么 iis是用来做什么的?   IIS全程为Internet Information Service(In ...

  5. 【PAT甲级】1082 Read Number in Chinese (25 分)

    题意: 输入一个九位整数,输出它的汉字读法(用拼音表示). trick: 字符串数组""其实会输出一个空格,而不是什么都不输出,导致测试点0和4格式错误. AAAAAccepted ...

  6. Python jupuyter 的安装与使用(windows下)

    1.win+R  cmd 打开命令窗 2.pip install jupyter pip安装jupyter 3.安装好后 执行jupyter的启动命令: jupyter notebook --ip=0 ...

  7. 传奇定时器OnTimer功能详解(泡点、时间触发、任务活动)

    传奇定时器OnTimer功能详解(泡点.时间触发.任务活动) 定时器功能,是传奇服务端中非常常见的一种功能,常见如:泡点脚本.赌博脚本,任务活动指定时间刷怪,时间触发一些都需要用到OnTimer功能, ...

  8. Kakfa概述及安装过程

    一.概述 1. Kafka是由LinkedIn(领英)开发的一个分布式的消息系统,最初是用作LinkedIn的活动流(Activity Stream)和运营数据处理的基础 a. 活动流数据包括页面访问 ...

  9. Top 9 colleges in the world from 2010 to 2020, AI and interdisciplinary areas.

    http://csrankings.org/

  10. 健壮的I/O(RIO)

    在上篇Unix系统级I/O中,我们介绍了有关在Unix环境下读取和写入文件的函数read和write,也提到了标准I/O在进行网络I/O时的局限性.但是在某些地方,直接使用read和write往往会出 ...