完c++快一年了,感觉很有遗憾,因为一直没有感觉到c++的强大之处,当时最大的感觉就是这个东西的输入输出比C语言要简单好写。

  后来我发现了qt,opencv,opengl,原来,c++好玩的狠。

  在这些图形库之外,最常用的可能就是STL,这个东西由于当时学c++的时候迷迷糊糊,完全是一头雾水,上学期数据结构之后开始有点儿开窍了,现在把才c++STL中常用的函数,用法贴一下,也是记录一下,希望能给一样迷糊的盆友们一些帮助。

  整理自《ACM程序设计》  

  迭代器(iterator)

  个人理解就是把所有和迭代有关的东西给抽象出来的,不管是数组的下标,指针,for里面的、list里面的、vector里面的,抽象一下变成了iterator

 #include <iostream>
#include <vector>
#include <iostream>
#include <vector> using namespace std; int main()
{
vector<int> v;
v.push_back(); //数组尾部插入3
v.push_back();
v.push_back();
v.push_back();
cout << " 下标 " << v[] << endl;
cout << " 迭代器 " << endl;
for(vector<int>::iterator i = v.begin();i!= v.end();++i)
{
cout << *i << " ";
}
cout << endl;
//在第一个元素之前插入111 insert begin+n是在第n个元素之前插入
v.insert(v.begin(),);
//在最后一个元素之后插入222 insert end + n 是在n个元素之后插入
v.insert(v.end(),); for(vector<int>::iterator i = v.begin();i!= v.end();++i)
{
cout << *i << " ";
}
cout << endl; vector<int> arr();
for(int i = ; i < ; i++)
{
arr[i] = i;
}
for(vector<int>::iterator i = arr.begin();i!= arr.end();++i)
{
cout << *i << " ";
}
cout << endl; //删除 同insert
arr.erase(arr.begin()); for(vector<int>::iterator i = arr.begin();i!= arr.end();++i)
{
cout << *i << " " ;
}
cout << endl ; arr.erase(arr.begin(),arr.begin()+); for(vector<int>::iterator i = arr.begin();i!= arr.end();++i)
{
cout << *i << " " ;
}
cout << endl ;
return ;
}
 using namespace std;

 int main()
{
vector<int> v;
for(int i = ; i < ; ++i )
{
v.push_back(i);
}
for(vector<int>::iterator it = v.begin(); it != v.end(); ++it)
{
cout << *it << " ";
}
cout << endl;
return ;
}

求和(<numeric> accumulate)

  accumulate(v.begin(),v.end(),0),把从 v.begin() 开始到 v.end()结束所有的元素加到 0上面去

#include <iostream>
#include <vector>
#include <numeric> using namespace std; int main()
{
vector<int> v;
for(int i = ; i < ; ++i )
{
v.push_back(i);
}
for(vector<int>::iterator it = v.begin(); it != v.end(); ++it)
{
cout << *it << " ";
}
cout << endl;
cout << accumulate(v.begin(),v.end(),) << endl;
return ;
}

vector(动态数组)

  vector有内存管理的机制,也就是说对于插入和删除,vector可以动态调整所占用的内存空间。  

  vector相关函数

数组转置 (<algorithm> reverse)

  reverse(v.begin(),v.end())

#include<iostream>
#include<vector>
#include<algorithm> using namespace std; int main()
{
vector<int> v;
for(int i = ; i < ; ++i)
{
v.push_back(i);
}
for(vector<int>::iterator it = v.begin(); it != v.end(); ++it)
{
cout << *it << " ";
}
cout << endl; reverse(v.begin(),v.end()); for(vector<int>::iterator it = v.begin(); it != v.end(); ++it)
{
cout << *it << " ";
}
cout << endl;
return ;
}

排序(<algorithm> sort)

  sort(v.begin(),v.end())

#include<iostream>
#include<vector>
#include<algorithm> using namespace std; bool Comp(const int &a,const int &b)
{
return a>b;
} int main()
{
vector<int> v;
v.push_back();
v.push_back();
v.push_back();
v.push_back();
v.push_back(-);
v.push_back();
v.push_back();
v.push_back();
v.push_back(); for(vector<int>::iterator it = v.begin(); it != v.end(); ++it)
{
cout << *it << " ";
}
cout << endl; //默认升序
sort(v.begin(),v.end()); for(vector<int>::iterator it = v.begin(); it != v.end(); ++it)
{
cout << *it << " ";
}
cout << endl; //用降序 需要自定义一个降序函数
sort(v.begin(),v.end(),Comp); for(vector<int>::iterator it = v.begin(); it != v.end(); ++it)
{
cout << *it << " ";
}
cout << endl; return ;
}

  字符串(<string>)

  输入

#include<iostream>
#include<string>
#include<cstdio> using namespace std; int main()
{
string s1;
s1 = "hello"; string s2;
char s[];
//scanf 输入速度比cin快的多
//scanf 是C函数,不可以输入string
scanf("%s",s);
s2 = s; cout << s1 << endl;
cout << s2 << endl; return ;
}

尾部添加字符字符串直接用+号 例如: s += 'a'; s += "abc",或者使用append方法,s.append(“123”)

  删除 (erase clear)

  s.erase(it + 1,it + 4); clear()

#include<iostream>
#include<string> using namespace std; int main()
{
string s;
s = "";
cout << s << endl; string::iterator it = s.begin(); //删除s[3]
s.erase(it+);
cout << s << endl; //删除s[1]~s[3]
s = "";
s.erase(it + ,it + );
cout << s << endl; //全部删除
s.clear();
cout << "clear : " << s << endl; return ;
}

查找(find)

  用find找到string里面第一个要找到元素(char或者串),找到返回数组下标,找不到返回end()迭代器

  string和vector有很多相同的东西,比如length(),size(),empty(),reverse(),相对也容易,就不一一说了。

  数字化处理(string)

  经常会遇到这样一种情况,有一个数字,需要把每一位给提取出来,如果用取余数的方法,花费的时间就会很长,所以可以当成字符串来处理,方便、省时。

  例子:求一个整数各位数的和

#include<iostream>
#include<string> using namespace std; int main()
{
string s;
s = "";
int sum = ;
for(int i = ; i < s.size(); ++i)
{
switch(s[i])
{
case '': sum += ;break;
case '': sum += ;break;
case '': sum += ;break;
case '': sum += ;break;
case '': sum += ;break;
case '': sum += ;break;
case '': sum += ;break;
case '': sum += ;break;
case '': sum += ;break;
}
} cout << sum << endl; return ;
}

string与char *

#include<iostream>
#include<string>
#include<cstdio> using namespace std; int main()
{
string s_string;
char s_char[];
scanf("%s",s_char); s_string = s_char; //printf输出char* 时用c_str处理
printf(s_string.c_str());
cout << endl; printf("%s",s_char);
cout << endl; cout << s_char << endl;
cout << s_string << endl;
return ;
}

sscanf

 #include<iostream>
#include<string>
#include<cstdio> using namespace std; int main()
{
string s1,s2,s3;
char sa[],sb[],sc[];
sscanf("abc 123 wcd","%s%s%s",sa,sb,sc);
s1 = sa;
s2 = sb;
s3 = sc;
cout << s1 << " " << s2 << " " << s3 << endl; //将字符串分离成数字,分隔符为',''$'
int a,b,c;
sscanf("4,5$6","%d,%d$%d",&a,&b,&c);
cout << a << " " << b << " " << c << endl;
return ;
}

string与数值相互转换( sprintf <sstream> )

#include<iostream>
#include<string>
#include<sstream>
#include<cstdio> using namespace std; //c++ 方法 把数转换为string
string converToString(double x)
{
ostringstream o;
if( o << x)
{
// str()没有'\0' c_str有
return o.str();
}
return "error";
} double converFromString(const string &s)
{
istringstream i(s);
double x;
if( i >> x)
{
return x;
}
//if error
return 0.0;
}
int main()
{
char b[];
string s1; //c语言方法
sprintf(b,"%d",);
s1 = b;
cout << s1 << endl; string s2 = converToString();
cout << s2 << endl; string s3 = "";
int c = converFromString(s3);
cout << c << endl; string s4 = "casacsa6";
int d = converFromString(s4);
cout << d << endl; string s5 = "21abf4";
int f = converFromString(s5);
cout << f << endl; return ;
}

set容器

  set是用红黑树的平衡二叉索引树的数据结构来实现的,插入时,它会自动调节二叉树排列,把元素放到适合的位置,确保每个子树根节点的键值大于 左子树所有的值、小于右子树所有的值,插入重复数据时会忽略。set迭代器采用中序遍历,检索效率高于vector、deque、list,并且会将元素 按照升序的序列遍历。set容器中的数值,一经更改,set会根据新值旋转二叉树,以保证平衡,构建set就是为了快速检索(python中的set一旦 建立就是一个常量,不能改的)。

multiset,与set不同之处就是它允许有重复的键值。

  正反遍历,迭代器iterator、reverse_iterator

#include<iostream>
#include<set> using namespace std; int main()
{
set<int> v;
v.insert();
v.insert();
v.insert();
v.insert();
v.insert();
v.insert(); //中序遍历 升序遍历
for(set<int>::iterator it = v.begin(); it != v.end(); ++it)
{
cout << *it << " ";
}
cout << endl; for(set<int>::reverse_iterator rit = v.rbegin(); rit != v.rend(); ++rit)
{
cout << *rit << " ";
}
cout << endl; return ;
}

自定义比较函数,insert的时候,set会使用默认的比较函数(升序),很多情况下需要自己编写比较函数。

  1、如果元素不是结构体,可以编写比较函数,下面这个例子是用降序排列的(和上例插入数据相同):

 #include<iostream>
#include<set> using namespace std; struct Comp
{
//重载()
bool operator()(const int &a, const int &b)
{
return a > b;
}
};
int main()
{
set<int,Comp> v;
v.insert();
v.insert();
v.insert();
v.insert();
v.insert();
v.insert(); for(set<int,Comp>::iterator it = v.begin(); it != v.end(); ++it)
{
cout << *it << " ";
}
cout << endl; for(set<int,Comp>::reverse_iterator rit = v.rbegin(); rit != v.rend(); ++rit)
{
cout << *rit << " ";
}
cout << endl; return ;
}

2、元素本身就是结构体,直接把比较函数写在结构体内部,下面的例子依然降序:

 #include<iostream>
#include<set>
#include<string> using namespace std; struct Info
{
string name;
double score; //重载 <
bool operator < (const Info &a) const
{
return a.score < score;
}
};
int main()
{
set<Info> s;
Info info; info.name = "abc";
info.score = 123.3;
s.insert(info); info.name = "EDF";
info.score = -23.53;
s.insert(info); info.name = "xyz";
info.score = 73.3;
s.insert(info); for(set<Info>::iterator it = s.begin(); it != s.end(); ++it)
{
cout << (*it).name << ":" << (*it).score << endl;
}
cout << endl; for(set<Info>::reverse_iterator rit = s.rbegin(); rit != s.rend(); ++rit)
{
cout << (*rit).name << ":" << (*rit).score << endl;
}
cout << endl; return ;
}

multiset与set的不同之处就是key可以重复,以及erase(key)的时候会删除multiset里面所有的key并且返回删除的个数。

map

  map也是使用红黑树,他是一个键值对(key:value映射),便利时依然默认按照key程序的方式遍历,同set。

 #include<iostream>
#include<map>
#include<string> using namespace std; int main()
{
map<string,double> m; //声明即插入
m["li"] = 123.4;
m["wang"] = 23.1;
m["zhang"] = -21.9;
m["abc"] = 12.1;
for(map<string,double>::iterator it = m.begin(); it != m.end(); ++it)
{
//first --> key second --> value
cout << (*it).first << ":" << (*it).second << endl;
}
cout << endl;
return ;
}

用map实现数字分离

  string --> number

  之前用string进行过数字分离,现在使用map

c++常用函数STL的更多相关文章

  1. 【算法专题】工欲善其事必先利其器—— 常用函数和STL

    一.    常用函数 #include <stdio.h> int getchar( void );               //读取一个字符, 一般用来去掉无用字符 char *ge ...

  2. C++——STL之vector, list, deque容器对比与常用函数

    STL 三种顺序容器的特性对比: vector 可变数组,内存空间是连续的,容量不会进行缩减.支持高效随机存取,即支持[]和at()操作.尾部插入删除效率高,其他位置插删效率较低: list 双向链表 ...

  3. STL algorithm 头文件下的常用函数

    algorithm 头文件下的常用函数 1. max(), min()和abs() //max(x,y)和min(x,y)分别返回x和y中的最大值和最小值,且参数必须时两个(可以是浮点数) //返回3 ...

  4. STL之map与pair与unordered_map常用函数详解

    STL之map与pair与unordered_map常用函数详解 一.map的概述 map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称 ...

  5. STL之vector常用函数笔记

    STL之vector常用函数笔记 学会一些常用的vector就足够去刷acm的题了 ps:for(auto x:b) cout<<x<<" ";是基于范围的 ...

  6. 刷题常用的STL容器总结

    本文归纳总结刷题常用到STL容器以及一些标准算法,主要包括: string.vector.map.pair.unordered_map.set.queue.priority_queue.stack,以 ...

  7. oracle常用函数及示例

    学习oracle也有一段时间了,发现oracle中的函数好多,对于做后台的程序猿来说,大把大把的时间还要学习很多其他的新东西,再把这些函数也都记住是不太现实的,所以总结了一下oracle中的一些常用函 ...

  8. 总结js常用函数和常用技巧(持续更新)

    学习和工作的过程中总结的干货,包括常用函数.常用js技巧.常用正则表达式.git笔记等.为刚接触前端的童鞋们提供一个简单的查询的途径,也以此来缅怀我的前端学习之路. PS:此文档,我会持续更新. Aj ...

  9. [转]SQL 常用函数及示例

    原文地址:http://www.cnblogs.com/canyangfeixue/archive/2013/07/21/3203588.html --SQL 基础-->常用函数 --===== ...

随机推荐

  1. IdentityServer4 + SignalR Core +RabbitMQ 构建web即时通讯(一)

    IdentityServer4 + SignalR Core +RabbitMQ 构建web即时通讯 前言 .net core 2.1已经正式发布了,signalr core1.0随之发布,是时候写个 ...

  2. MySQL集群搭建

    在集群中的所有主机上安装提供集群功能的软件包 官网上下载的  mysql-cluster-gpl-7.3.12-linux-glibc2.5-x86_64.tar.gz 规划了5台服务器,10.10. ...

  3. 【BZOJ3451】Tyvj1953 Normal 点分治+FFT+期望

    [BZOJ3451]Tyvj1953 Normal Description 某天WJMZBMR学习了一个神奇的算法:树的点分治!这个算法的核心是这样的:消耗时间=0Solve(树 a) 消耗时间 += ...

  4. Redis实现主从复制(转)

    一.Redis的Replication: 这里首先需要说明的是,在Redis中配置Master-Slave模式真是太简单了.相信在阅读完这篇Blog之后你也可以轻松做到.这里我们还是先列出一些理论性的 ...

  5. 九度OJ 1064:反序数 (基础题)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:3758 解决:2773 题目描述: 设N是一个四位数,它的9倍恰好是其反序数(例如:1234的反序数是4321) 求N的值 输入: 程序无任 ...

  6. cocos2d-js添加广点通插屏(通过jsb反射机制)

    1.把广点通的jar包加入libs文件夹 2.修改AndroidManifest.xml文件 添加权限: <uses-permission android:name="android. ...

  7. 新版本ADT创建Android项目无法自动生成R文件解决办法

    本人使用的是ADT是Version 23.0.2,支持Android 6.0之后的系统环境,最高版本23,在创建Android项目的时候,每次创建项目选择“Compile With”低于6.0版本的时 ...

  8. Java基础之I/O流

    一.数据流的基本概念 数据流是一串连续不断的数据的集合,就象水管里的水流,在水管的一端一点一点地供水,而在水管的另一端看到的是一股连续不断的水流.数据写入程序可以是一段.一段地向数据流管道中写入数据, ...

  9. Java for LeetCode 110 Balanced Binary Tree

    Given a binary tree, determine if it is height-balanced. For this problem, a height-balanced binary ...

  10. 有关svg的一些理解

    SVG 是使用XML来描述二维图形和绘图程序的语言. SVG指可伸缩的矢量图形(Scalable Vector Graphics) SVG使用XML格式定义图形 SVG图形在放大或改变尺寸的情况下,图 ...