STL心得
- 熟悉c++版算法竞赛程序框架
- 理解变量引用的原理
- 熟练掌握string和stringstream
- 熟练掌握c++结构体的定义和使用,包括构造函数和静态成员变量
- 了解常见的可重载运算符,包括四则运算,赋值,流式输入输出,()和 [ ]
- 了解模板函数和模板类的概念
- 熟练掌握stl中排序和检索的相关函数
- 熟练掌握stl中vector,set,map这3个容器
- 了解stl中的集合相关函数
- 理解栈,队列和优先队列的概念,并用stl实现它们
- 熟练掌握随机数生成方法,并能结合assert宏进行测试
- 能独立编写大整数类BigInteger
·string
标准库类型string表示可变长的字符序列,使用string类型必须首先包含string头文件。
初始化string对象:
使用等号初始化实际上是拷贝初始化,不使用则为直接初始化。
string s1; //默认初始化,s1是一个空字符串 string s2 = s1; //s2是s1的副本 string s3 = "hiya"; //s3的内容是该字符串字面值的副本 string s4(, 'c'); //s4的内容是cccccccccc
string对象上的操作:
os<<s //将s写到输出流os当中,返回os is>>s //从is中读取字符串赋给s,字符串以空白分隔,返回is getline(is,s) //从is中读取一行赋给s,返回is s.empty() //s为空返回true,否则返回false s.size() //返回s中字符的个数 s[n] //返回s中第n个字符的引用,位置n从0记起 s1+s2 //返回s1和s2连接后的结果 s1 == s2 //用s2的副本替代s1中原来的字符 s1!=s2 //等性判断对字母大小写敏感 <, <=, >, >= //利用字符在字典中的顺序进行比较,且对字母的大小写敏感
读取未知数量的string对象:
在执行读取操作时,string会自动忽略开头的空白(即空格符,换行符,制表符等),并从第一个真正的字符开始读起,知道遇到下一处空白为止。
int main()
{
string word;
while(cin >> word) //反复读取,直至到达文件末尾
cout << word << endl; //逐个输出单词,每个单词后面紧跟一个换行
return ;
}
使用getline读取一整行:
当我们希望在最终得到的字符串中保留输入时的空白符,这时应该用getline函数替代原来的>>运算符。getline函数的参数是一个输入流和一个string对象,函数从给定的输入流读入内容,直到遇到换行符为止(注意换行符也被读来了),然后把所读的内容存入到那个string对象中去(注意不存换行符)。getline只要一遇到换行符就结束读取操作并返回结果,哪怕输入的一开始是换行符也是如此。如果输入的真的一开始就是换行符,那么所得到的结果是个空的string。
可以通过改写之前的程序让它一次输出一整行而非每行一个单词了:
int main()
{
string line;
//每次读入一整行,直至到达文件末尾
while(getline(cin,line))
cout << line << endl;
return ;
}
因为line中不包含换行符,所以我们手动加上换行符操作。和往常一样,使用endl结束当前行并刷新显示缓冲区。
cctype头文件的函数:
isalnum(c) //当c是字母或数字时为true isalpha(c) //当c是字母时为true isdigit(c) //当c是数字时为true islower(c) //当c是小写字母时为true isupper(c) //当c是大写字母为true isspace(c) //当c是空白时为true(即c是空格/制表符/回车符/换行符/进纸符之中的一种) ispunct(c) //当c是标点符号为true(即c不是控制字符/数字/字母/可打印空白之中的一种) tolower(c) //当c是大写字母,输出对应小写字母,否则原样输出 toupper(c) //当c是小写字母,输出对应大写字母,否则原样输出
只处理一部分字符:
想要访问string对象中的单个字符有两个方式:一种是使用下标,另一种是使用迭代器。
下标运算符([])接受的输入参数是表示要访问的字符的位置,返回值是该位置上字符的引用。string对象的下标 》0 && <s[s.size()] s[s.size()-1]是最后一个字符。
·string和stringstream区别
【定 义】:可以简单的这样理解,string是一种数据类型,而stringstream是针对string的一种数据流出或者流入的操作,相当于I/O操作。字符串流是通过空格判断一个字符串的结束 。需要记住:C++中可以使用流简化输入输出操作。
【注 意】:
- stringstream是字符串流,经常被我用来作数据切分(空格划分)或者类型转化。字符串流主要还是用来遍历字串符的。一个简单的用法,如果一个字符串格式为 数字.数字.数字
此字符串用来表示时间,若要取三个数字
input >> a >> ch >> b >> ch >> c;即可。stringstream就是string流,把数据放进string或从string里取数据相当于c的sprintf/scanef。 - 1.对stringstream对象使用>>操作符会改变对象保存的内容,会移除开头的一部分用分隔符隔开的字符串。
2.对stringstream对象使用str("")方法后对象变成“错误的指针”状态,此后必须要用clear()才能清除错误状态。
综上,使用clear方法才是正确的。
【基本用法】: stringstream是字符串流。它将流与存储在内存中的string对象绑定起来。
在多种数据类型之间实现自动格式化。 1.stringstream对象的使用
#include<sstream>
#include<iostream>
using namespace std;
int main()
{
string line,word;
while(getline(cin,line))
{
stringstream stream(line);
cout<<stream.str()<<endl;
while(stream>>word){cout<<word<<endl;}
}
return ;
} /*
输入:shanghai no1 school 1989
输出:shanghi no1 school 1989
shanghai
no1
school
*/
2.stringstream提供的转换和格式化
程序:
#include<sstream>
#include<iostream>
using namespace std;
int main()
{
int val1 = ,val2 =;
stringstream ss;
ss<<"val1: "<<val1<<endl //“val1: "此处有空格,字符串流是通过空格判断一个字符串的结束
<<"val2: "<<val2<<endl;
cout<<ss.str(); string dump;
int a,b;
ss>>dump>>a
>>dump>>b;
cout<<a<<" "<<b<<endl;
return ;
} 输出为:val1:
val2:
第一处黑体字部分:将int类型读入ss,变为string类型
第二处黑体字部分:提取512,1024保存为int类型。当然,如果a,b声明为string类型,那么这两个字面值常量相应保存为string类型 3.其他注意
stringstream不会主动释放内存(或许是为了提高效率),但如果要在程序中用同一个流,反复读写大量的数据,将会造成大量的内存消耗,因些这时候,需要适时地清除一下缓冲 (用 stream.str("") )
#include <cstdlib>
#include<iostream>
#include<sstream>
using namespace std;
int main()
{
stringstream ss;
string s;
ss<<"shanghai no1 school";
ss>>s;
cout<<"size of stream = "<<ss.str().length()<<endl;
cout<<"s: "<<s<<endl;
ss.str("");
cout<<"size of stream = "<<ss.str().length()<<endl;
} 输出:
size of stream =
s: shanghai
size of stream =
·在C++中,什么时候必须使用引用?C/C++何时使用引用和指针
使用引用,就不用调用对象的拷贝构造函数,将对象本身传如函数里面,比如:
void add(const A& a); // 这样传入的就是引用,调用此函数时,就是直接使用a
void add(A a); // 这样传入的是对象的拷贝进去,需要构造这样的一个对象传递进去,效率没上面的高。 ·顺序容器,常用的顺序容器头文件分别是:
#include <vector>//不定长数组
#include <map>//映射
#include <set>//集合
#include <list>//链表
#include <deque>//*双向队列
#include <queue>//队列
#include <stack>//堆栈
1.“不定长数组vector”
声明方法:
vector是一个模板类,所以需要用vector<int> a或者vector<double> b这样的方式来声明一个vector。vector(以及string对象)的下标运算符可用于访问已存在的元素,而不能用于添加元素。
vecto<int> a; a.size( ); //读取a的大小 a.resize( ); //改变a的大小 a.push_back( ); //向a的尾部添加元素 a.pop_back( ); //删除a的最后一个元素 a.clear( ); //清空a a.empty( ); //测试a是否为空
vector<int> pile[maxn];
还有点要说,这条语句定义了一个名称为pile的二维向量,有pile[1],pile[2]...pile[maxn]共maxn个,每个pile[n]代表一个木块堆,容量大小是可变的。
2.“集合:set”
声明方法:Sets are containers that store unique(唯一的)elements following a specific order.
基本操作:
#include <set> set<string> exclusion_set; exclusion_set.size();//获取exclusion_set的大小 exclusion_set.empty();//清空exclusion_set exclusion_set.erase();//删除exclusion_set中的元素 exclusion_set.find();//如果元素存在,则find()返回指向这个元素的
iterator,否则返回一个等于end()的iterator表示该元素不存在 exclusion_set.count();//如果找到元素,count()返回1,如果元素不存在,则返回0
3.“映射:map”
map与之前的set有一些相似之处,比如map的键值也具有独一性,任意两个不同的元素不能拥有相同的键值。所以插入可能失败,如之前所说,与set不同的是,map由键/值对构成,是从键(key)到值(value)的映射。
声明方法:为定义map对象,我们至少要指明键和值的类型,例如:map<string, int> word_count;
4. “可重复集合:multiset”
set和multiset的区别在于set容器里不能有重复元素。a和b重复<=>“a必须排在b前面”和“b必须排在a前面”都不成立。
定义了一个multiset变量st,st里面可以存放T类型的数据,并且自动排序。开始st为空。
排序规则:表达式“a<b”为true,则a排在b前面。
可用st.insert添加元素,st.find查找元素,st.erase删除元素,复杂度都为log(n)。
#include<iostream>
#include<cstring>
#include<set>
using namespace std; int main()
{
multiset<int> st;
int a[]={ ,,,,,,,,, }; for(int i = ; i < ; i++)
st.insert( a[i] ); //插入的是a[i]的复制品 multiset<int>::iterator i; //迭代器,近似于指针
for(i = st.begin(); i != st.end(); i++)//不要重新int i !!!
cout<< * i << ",";
cout<<endl;
return ;
}
STL心得的更多相关文章
- STL学习心得
STL的知识翻来复去,也就那么回事,但是真的想要熟练使用,要下一番功夫.无论是算法,还是STL容器,直白的说就是套路,然而对于一道题,告诉你是STL容器的题,让你套容器也绝非易事. 怎样使用容器,对于 ...
- windows类书的学习心得(转载)
原文网址:http://www.blogjava.net/sound/archive/2008/08/21/40499.html 现在的计算机图书发展的可真快,很久没去书店,昨日去了一下,真是感叹万千 ...
- 最经常使用的两种C++序列化方案的使用心得(protobuf和boost serialization)
导读 1. 什么是序列化? 2. 为什么要序列化?优点在哪里? 3. C++对象序列化的四种方法 4. 最经常使用的两种序列化方案使用心得 正文 1. 什么是序列化? 程序猿在编写应用程序的时候往往须 ...
- windows类书的学习心得
原文网址:http://www.blogjava.net/sound/archive/2008/08/21/40499.html 现在的计算机图书发展的可真快,很久没去书店,昨日去了一下,真是感叹万千 ...
- 最常用的两种C++序列化方案的使用心得(protobuf和boost serialization)
导读 1. 什么是序列化? 2. 为什么要序列化?好处在哪里? 3. C++对象序列化的四种方法 4. 最常用的两种序列化方案使用心得 正文 1. 什么是序列化? 程序员在编写应用程序的时候往往需要将 ...
- Effective STL读书笔记
Effective STL 读书笔记 本篇文字用于总结在阅读<Effective STL>时的笔记心得,只记录书上描写的,但自己尚未熟练掌握的知识点,不记录通用.常识类的知识点. STL按 ...
- 修改BUG心得
修改BUG心得 分类: 项目管理/CMMI2013-01-14 22:06 845人阅读 评论(0) 收藏 举报 目录(?)[-] 一 二 三 一. 1.写第一版时就杜绝这些的发生. 2.思维要开 ...
- sdut 2159:Ivan comes again!(第一届山东省省赛原题,STL之set使用)
Ivan comes again! Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^ 题目描述 The Fairy Ivan gave Say ...
- folly学习心得(转)
原文地址: https://www.cnblogs.com/Leo_wl/archive/2012/06/27/2566346.html 阅读目录 学习代码库的一般步骤 folly库的学习心得 ...
随机推荐
- JQuery事件对象的属性和方法
这是今天的总结,以后学习自己可以当参考书来读读.Event 对象代表事件的状态,比如事件在其中发生的元素.键盘按键的状态.鼠标的位置.鼠标按钮的状态.事件通常与函数结合使用,函数不会在事件发生前被执行 ...
- [SCOI2012]喵星球上的点名——堪称十种方法做的题
题意: 给你N个串对,M个询问串,对每个询问串求是多少串对的子串(在串对的某一个中作为子串),以及每个串对最终是包含了多少询问串 方法众多.. 可谓字符串家族八仙过海各显神通. 复杂度不尽相同,O(n ...
- Spring源码解析-事件
Spring事件的组件 主要是3个组件: 1.ApplicationEvent 事件 2.ApplicationListener 监听器,对事件进行监听 3.ApplicationEventMul ...
- D. Relatively Prime Graph
Let's call an undirected graph G=(V,E)G=(V,E) relatively prime if and only if for each edge (v,u)∈E( ...
- 最大流算法 ISAP 模板 和 Dinic模板
ISAP // UVa11248 Frequency Hopping:使用ISAP算法,加优化 // Rujia Liu struct Edge { int from, to, cap, flow; ...
- 解决tomcat不支持中文路径的问题
问题描述: 开发文件下载功能时,因为需求比较简单,要求下载一个说明文件.于是,直接给出了文件所在服务器的地址,通过链接直接下载此文件(因需求简单,未考虑安全方面的问题-_-||). 在这个过程中,文件 ...
- SPOJ 1182 Sorted bit sequence
题目链接 题意: 分析: 其实如果会了Ural 1057. Amount of Degrees那道题目,这道题自然也就会了... 我们考虑枚举第$k$个数字的$1$的个数,那么我们需要计算的也就是区间 ...
- bzoj 1050: [HAOI2006]旅行comf&&【codevs1001】
Description 给你一个无向图,N(N<=500)个顶点, M(M<=5000)条边,每条边有一个权值Vi(Vi<30000).给你两个顶点S和T,求 一条路径,使得路径上最 ...
- noip2014 提高组
T1 生活大爆炸版 石头剪刀布 题目传送门 就是道模拟题咯 #include<algorithm> #include<cstdio> #include<cstring&g ...
- 谈数据中心SDN与NFV
看到一篇谈论SDN与NFV的文章,分析的还不错,贴过来方便自己后续查阅: http://network.chinabyte.com/175/13095675.shtml 论数据中心SDN与NFV技术关 ...