【1】.不定长数组:vector(在头文件vector中)(元素可以重复哦)

vector是一个模板类,声明方式:vector<int>a或者vector<double>a.    Vector<int>是一个类似于inta[]的整数数组,而vector<string>就是一个类似于 string a[ ]的字符串数组

用法:可以用a.size( )返回实际元素的个数,a.resize( )改变大小,a.insert(position,ch)在指定位置插入一个或多个元素,a.push_back( )向尾部添加元素,a.pop_back( )删除最后一个元素,用clear( )清空,resize( ) 改变大小,用empty( )测试是否为空,erase()移除一个或一段元素,capacity()返回当前容量,reserve()增加容量,emplace()在指定位置生成一个元素(作用效果类似于insert,但两者的作用方式不同,emplace是直接在位置上构造一个元素,insert就是先构造再复制(或移动)过去数组中)。

数组初始化: vector<int>a(20,1);  定义一个含20个元素的数组,且每个元素值都为1

【2】集合set(在头文件set中)

set就是数学上的集合——每个元素最多只出现一次。

通过一道例题来学习

例题5-3 安迪的第一个字典(Andy's First Dictionary,Uva 10815) 输入一个文本,找出所有不同的单词(连续的字母序列),按字典序从小到大输出。单 词不区分大小写。

样例输入: Adventures in Disneyland Two blondes were going to Disneyland when they came to a fork in the road. The sign read: "Disneyland Left." So they went home.

样例输出(为了节约篇幅只保留前5行): a adventures blondes came disneyland

#include<iostream>
#include<string>
#include<set>
#include<sstream>//<sstream>库定义了三种类istringstream、ostringstream和stringstream
//分别用来进行流的输入、输出和输入输出操作
using namespace std;
set<string> dict; //string类型集合dict
int main() {
string s, buf;
while(cin >> s) {
for(int i = 0; i < s.length(); i++)
if(isalpha(s[i])) //判断是不是大小写字母
s[i] = tolower(s[i]);//将大写转化为小写
else s[i] = ' ';
stringstream ss(s);//ss是创建的流,//(s)指往流ss中输入字符串s,因为s包含了空格,不能用ss<<s
while(ss >> buf) //把流中的值一个一个输出到buf中
dict.insert(buf);//往dict中一个一个插入buf
}
for(set<string>::iterator it = dict.begin(); it != dict.end(); ++it)//         注意end()是dict的最后一个元素的下一个位置
cout << *it << "\n";
return 0;
}

iterator的意思是迭代器,是STL中的重要概念,类似于指针。和“vector类似于数组”一样,这里的“类似”指的是用法类似

max_size(), 返回set容器可能包含的元素最大个数

size()  ,返回当前set容器中的元素个数

还有:在多次输入和输出流前最好先clean()

可以实现类型的转换:int a;  ss<<"456";  ss>>a; cout<<a;  输出456

char a[8]; ss<<7777; ss>>a; cout<<a;    输出7777

#include<iostream>
#include<string>
#include<set>
using namespace std;
int main() {set<int>s1;set<int>::iterator it;for (int i = 1; i < 5; i++){s1.insert(i);}int a[] = { 1,2,3,4 };set<int>s2(a, a + 4);//向流s2中输入数组a中的4个元素for(it=s2.begin();it!=s2.end();it++)//end()指最后一个元素的下一个位置{cout << *it<<" ";}if ((it = s1.find(5)) != s1.end())cout << *it;//如果找不到()中的数字则返回end()的位置return 0;
}

【3】map  (头文件在map中)(元素不重复)

map就是从键(key)到值(value)的映射。(map<key,value>a;)因为重载了[ ]运算符,map像是数组的“高 级版”。例如可以用一个mapmonth_name来表示“月份名字到月份编号”的映射, 然后用month_name["July"]=7这样的方式来赋值 。 (默认对key值进行字典排序,从小到大,例如key为a的排在key为b的前面)

例题5-4 反片语(Ananagrams,Uva 156)

输入一些单词,找出所有满足如下条件的单词:该单词不能通过字母重排,得到输入文 本中的另外一个单词。在判断是否满足条件时,字母不分大小写,但在输出时应保留输入中 的大小写,按字典序进行排列(所有大写字母在所有小写字母的前面)。

样例输入: ladder came tape soon leader acme RIDE lone Dreis peat ScAlE orb eye Rides dealer NotE derail LaCeS drIed noel dire Disk mace Rob dries #

样例输出: Disk NotE derail drIed eye ladder soon

#include<iostream>
#include<string>
#include<cctype>
#include<vector>
#include<map>
#include<algorithm>
using namespace std;
map<string,int> cnt;
vector<string> words;
//将单词s进行“标准化”
string repr(const string& s) {
string ans = s;
for(int i = 0; i < ans.length(); i++)
ans[i] = tolower(ans[i]);//转为小写字母
sort(ans.begin(), ans.end());
return ans;
}
int main() {
int n = 0;
string s;
while(cin >> s) //一直接受一个字符串,遇“空格”、“TAB”、“\n”就结束当前字符串输入
{
if(s[0] == '#') break;
words.push_back(s);
string r = repr(s);
if(!cnt.count(r)) cnt[r] = 0;//count(key)key是键值,若cnt中无key则返回0
cnt[r]++;
}
vector<string> ans;
for(int i = 0; i < words.size(); i++)
if(cnt[repr(words[i])] == 1) ans.push_back(words[i]);
sort(ans.begin(), ans.end());//因为没有第三个参数cmp,默认从小到大排序
for(int i = 0; i < ans.size(); i++)
cout << ans[i] << "\n";
return 0;
}

对于sort函数,位于algorithm头文件中,sort(数组开始位置,数组结尾位置,cmp)                      如果想实现从大到小排序,自定义一个

bool cmp(int a,int b);

C++(STL)学习笔记相关推荐

  1. C++ STL学习笔记

    C++ STL学习笔记一 为何要学习STL: 数据结构与算法是编程的核心,STL中包含各种数据结构和优秀的算法,确实值得深入学习,本文中虽然着重使用,但希望有心的朋友能多看看相关数据结构的实现,对于C ...

  2. C++STL学习笔记(4) 分配器(Allocator)

    在前面的博客<C++ STL学习笔记(3) 分配器Allocator,OOP, GP简单介绍>中,简单的介绍了分配器再STL的容器中所担当的角色,这一节对STL六大部件之一的分配器进行详细 ...

  3. C++ STL学习笔记(3) 分配器Allocator,OOP, GP简单介绍

    继续学习侯捷老师的课程! 在前面的博客<C++ STL学习笔记(2) 容器结构与分类>中介绍了STL中常用到的容器以及他们的使用方法,在我们使用容器的时候,背后需要一个东西支持对内存的使用 ...

  4. C++ STL学习笔记 : 1. template 模板函数

    本篇文章是学习C++ STL库的第一篇笔记,主要记录了使用template关键字创建模板函数的方法. 下面用一个非常简单的例子解释模板函数的用法 : #include <iostream> ...

  5. C++ STL学习笔记(2) 容器结构与分类

    接着学习侯捷老师的C++ STL! 在使用容器的时候,需要明白容器中元素之间在内存里的关系是什么样的,是连续的,还是非连续的. 容器可以分为两类: 1. sequence container , 即序 ...

  6. C++ STL 学习笔记__(6)优先级队列priority_queue基本操作

    10.2.7优先级队列priority_queue v  最大值优先级队列.最小值优先级队列 v  优先级队列适配器 STL priority_queue v  用来开发一些特殊的应用,请对stl的类 ...

  7. 【C++ STL学习笔记】C++ STL序列式容器(array,vector,deque,list)

    文章目录 C++ STL容器是什么? 迭代器是什么,C++ STL迭代器(iterator)用法详解 迭代器类别 迭代器的定义方式 C++序列式容器(STL序列式容器)是什么 容器中常见的函数成员 C ...

  8. STL学习笔记(一)

    2019独角兽企业重金招聘Python工程师标准>>> 1. 容器(Containers) 容器分为两类: 序列式容器(Sequence containers),此乃可序群集,其中每 ...

  9. SGI STL 学习笔记二 vector

    sequence containers Array Vector Heap Priority_queue List sList(not in standard) Deque Stack Queue S ...

  10. C++ STL学习笔记 : 2. unordered map 容器

    本文中,简单总结一下使用unordered map 的心得.unordered_map容器属于STL中关联表的一种,常用的map容器与unordered_map容器在使用中有着很大程度的相同点,在之后 ...

最新文章

  1. 通过Sequentail网络容器创建LeNet-5
  2. Django和uwsgi,配合nginx做静态缓存
  3. monkey测试_爱码小士丨 APP稳定性测试(附视频详解)
  4. Golang 连接Kafka
  5. jzoj3910-Idiot的间谍网络【倍增,dfs】
  6. Oracle中输出一个变量
  7. android 拨打电话与发送短信
  8. 《贪玩蓝月》年入10亿?背后的玩法也太“流氓”了
  9. 改善CSS的10种最佳做法,帮助你从样式中获得最大的收益
  10. 基于nodej脚手架express-generator,生成express项目
  11. Alibaba之MySQL宝典_Alibaba之MySQL宝典流出!极致经典,堪称行业天花板
  12. 日志易智能日志分析助力农信银双十一运维降本增效
  13. 一行html代码微信透明头像,微信透明头像,微信空白名,立刻消失
  14. IFIX数据写入html,iFIX常见问题问答.doc
  15. cocoscreator利用中点位移算法制作闪电
  16. 嵌入式实践教程--i.MX8M family Secure Boot HABv4签名实战
  17. 520最浪漫表白:QQ打开基于Python实现的无法拒绝的音乐表白代码!别让等待,成了遗憾!
  18. 真·富文本编辑器的演进之路-Span开胃菜
  19. 【FXCG】展望2022人民币兑美元汇率走向何方
  20. RedHatLinux6.5下安装无线网卡驱动

热门文章

  1. 电脑上最好的3个小说阅读器
  2. PTA 7-80 打折促销*
  3. 【P110 27】C++ 深拷贝与浅拷贝
  4. 想要教AI一个常识真的好难,幸运的是保罗·艾伦拿钱闯进来了
  5. (TPR译文)全身表示教学方法
  6. python连接hive步骤(不出错版)
  7. 姚前:美联储数字货币原型系统简析
  8. 怎样投注‘11选5’中奖更多
  9. windows10映射网络驱动器教程、步骤(出现网络错误、浏览不能选择的解决办法)
  10. linux uda1341驱动