C++  STL初学笔记

更系统的版本见徐本柱的PPT

Ref:https://github.com/huihut/interview/tree/master/STL

set

在这儿:http://www.cnblogs.com/pdev/p/4035020.html

#include <vector>

可看作可以动态改变大小的数组。

注意:vector作为数组,下标自动从0开始

定义:vector <数据类型> v

    扩展:二维数组:   vector<vector<int> > Array2D;

应用:void  v.insert(int a,数据类型b) :在数组的第a个数后面插入b

        void  v.erase(int a,int b) :删除数组中位置从ab的元素

int  v.begin() :返回数组位置(迭代器)

int  v.end() :返回数组结尾位置(迭代器)

数据类型  v.front() :返回第一个数据

数据类型  v.back() :返回末尾的数据

      void  v.push_back(n) :在容器尾端插入新元素n

      void  v.pop_back() :删除结尾的一个元素

void  v.reserve(int n) :重新定义数组大小

int  v.empty() :判断容器是否为空。是则返回1

     int  v.size() :返回容器中元素个数

--------------------------------------------------------------------------

容器的迭代器:相当于数组的指针

Eg: 

 #include <cstdio>
#include <vector>
#include <cstdlib>
#include <iostream>
using namespace std; int main(int argc, char *argv[])
{
vector<int> arr;
int n, data;
while (cin >> n)
{
arr.clear(); //clean the array
if (arr.empty())
{
cout << "It's empty!" << endl;
}
for (int i = ; i < n; ++i)
{
cin >> data;
arr.push_back(data);
}
cout << "The size of the array is " << arr.size() << endl;
cout << "All the element(s) in the array is(are) ";
/*
for (vector<int>::iterator it = arr.begin(); it != arr.end(); ++it)
{
cout << *it << " ";
}
*/ //用迭代器
for (int x=;x<n;x++)
cout<<arr[x]<<" "; //注意:vector和map还可以用这种类似数组下标的方式访问
cout << endl;
}
return EXIT_SUCCESS;
}

---------------------------------------------------------------------------

#include <deque>

同vector,但可以在头部插入元素

定义:deque <数据类型> d

应用:void  d.push_back(数据类型 n) :在数组尾端插入新元素n

void  d.push_front(数据类型 n) :在数组头部插入新元素n

void  d.pop_back(数据类型 n) :在数组尾部删除一个元素n

void  d.pop_front(数据类型 n) :在数组头部删除一个元素n

void  d.clear() :删除所有元素

void  d.erase(int n) :删除指定位置元素

void  d.insert(int a,数据类型 b) :指定位置插入元素

其他vector中的操作也适用。

--------------------------------------------------------------------------

#include <string>

字符串

定义:string s(“字符串”)

应用:可以在数组中使用:string a[10];        string a[10][10];

i=a[10][10].lenght();      cout<<a[10][10];

a[5][6]==a[2][4];

void  string s2(s1) :将s1复制到s2     (s1可以是字符串or字符数组)

void  string s(字符数组chs,int n) :将chs的前n个字符作为s的初值

void  s1.swap(s2) :两string值互换

void  s.append(string s1) :在末尾添加一段字符串s1

void  s.erase(int a,int b) :在a位置开始删b个字符

void  s.replace(int a,int b,string s1) :将a~b这一段替换成s1    (若s1置为””可实现删除a~b这一段的字符串)

(s1==s2)、(s1<=s2)、(s1<s2) :比较字符串(按字典序)

S1=s2;    把s2赋给s1

S3=s1+s2;    把s2接到s1后

S[i]=’X’;    以字符数组的形式操作(注意:单个字符属于char,用单引号)

int  s.length() :返回字符串长度

s[n]:Return the character @ position n in s (position starts @ 0)

int  s.size() : 返回字符串长度(换行符、空格等控制符算一个字符)

int  s.empty() :返回字符串是否为空。返回值1为是

cin>>s5;  读取有效字符到遇到空格

    getline(cin,s6);  读取字符到遇到换行,空格可读入,直到‘\n’结束

    getline(cin,s7,'a'); 直到‘a’结束,其中任何字符包括'\n'都能够读入

    s.find(“string”) : 返回s中子串”string”出现的位置(若找不到,输出-1)

Useful functions:  (stdio.h)

      strstr

      strchr

      strtok

Useful Statements:    while(cin>>s)   or   while(getline(cin,s))

{These functions are defined in the cctype header

isalnum(c)   返回true,若c是字母or数字

isalpha(c)   返回true,若c是字母

isdigit(c)   返回true,若c是数字

islower(c)   返回true,若c是小写字母

ispunct(c)   返回true,若c是标点符号

isspace(c)   返回true,若c是空格

isupper(c)   返回true,若c是大写字母

toupper(c)    若c是小写,则返回对应的大写字母。否则直接返回c

tolower(c)    若c是大写,则返回对应的小写字母。否则直接返回c

}

参考:

http://blog.csdn.net/isgray/article/details/6853700

find(): http://blog.csdn.net/longshengguoji/article/details/8539471

         http://www.cnblogs.com/processakai/archive/2011/06/24/2089348.html

sstream: http://www.2cto.com/kf/201403/285676.html

------------------------------------------------------------------------------

#include <stack>

栈(容量无限制)

定义:stack <数据类型> s

应用:void  s.push(数据类型 s) :入栈

        数据类型  s.top() :输出栈顶元素

      Void  s.pop() :栈顶元素出栈

        Int s.empty() :检测栈是否为空    1为是

     int  s.size() :返回栈中元素个数

-----------------------------------------------------------------------

#include <queue>

队列

定义:queue <数据类型> q

应用:void  q.push(数据类型 n) :入队

        Void  q.pop() :出队

        Int  q.empty() :检测队是否为空    1为是

        数据类型  q.back() :输出队尾元素

        数据类型  q.front() :输出队首元素

        Int  q.size() :输出队列的元素个数

-------------------------------------------------------------------------

#include <queue>

拓展:优先队列

定义:priority_queue <数据类型> q

(优先队列保证队列中最大的元素总是位于队首)

应用:同队列

-------------------------------------------------------------------------

堆操作

首先,需要#include <algorithm>

void  make_heap(start_pointer,end_pointer,comp)        在指定范围的数组上建堆

void  pop_heap(start_pointer,end_pointer,comp)            删除堆顶元素,然后重建堆

void  push_heap(start_pointer,end_pointer,comp)          假设数组区间a[start]……a[end-1]已经是一个堆,然后将a[end]作为要入堆的新元素加进去,使得a[start]……a[end]是一个堆

void  sort_heap(start_pointer,end_pointer,comp)            假设数组区间a[start]……a[end-1]已经是一个堆,然后对其中的序列进行排序(排序后就不是一个有效堆了>_<)

注释:start_pointer、end_pointer分别表示起始位置、终止位置的指针

(调用方法示例:make_heap(&number[0],&number[12],cmp);

Cmp为比较函数(若不指定,默认建大根堆)

---------------------------------------------------------------------------

#include<map>

内部用红黑树实现,可实现一个Hash表用于查找(根据key查找value

Reference:http://www.oschina.net/question/234345_48876

Eg:

 #include <map>
#include <string>
#include <utility>
#include <cstdlib>
#include <iostream>
using namespace std; int main(int argc, char *argv[])
{
int n, m;
string name;
int phone_id;
map<string, int> hs;
while (cin >> n >> m)
{
hs.clear();
for (int i = ; i < n; ++i)
{
cin >> name >> phone_id;
hs.insert(pair<string, int>(name, phone_id)); //插入
}
cout << "List:" << endl;
for (map<string, int>::iterator it = hs.begin(); it != hs.end(); ++it) //用迭代器遍历
{
cout << it->first << " " << it->second << endl; //输出key和value
}
while (m--)
{
cin >> name;
if (hs.find(name) != hs.end()) //find返回name所在位置
{
cout << hs[name] << endl;
}
else
{
cout << "No such peron in your telephone directory." << endl;
}
}
}
return EXIT_SUCCESS;
}

C++ STL初学笔记的更多相关文章

  1. Effective STL 读书笔记

    Effective STL 读书笔记 标签(空格分隔): 未分类 慎重选择容器类型 标准STL序列容器: vector.string.deque和list(双向列表). 标准STL管理容器: set. ...

  2. Spring 初学笔记

    Spring 初学笔记: https://blog.csdn.net/weixin_35909255/article/category/7470388

  3. Effective STL读书笔记

    Effective STL 读书笔记 本篇文字用于总结在阅读<Effective STL>时的笔记心得,只记录书上描写的,但自己尚未熟练掌握的知识点,不记录通用.常识类的知识点. STL按 ...

  4. Effective STL 学习笔记 39 ~ 41

    Effective STL 学习笔记 39 ~ 41 */--> div.org-src-container { font-size: 85%; font-family: monospace; ...

  5. Effective STL 学习笔记 Item 38 : Design functor classes for pass-by-value

    Effective STL 学习笔记 Item 38 : Design functor classes for pass-by-value */--> div.org-src-container ...

  6. Effective STL 学习笔记 Item 34: 了解哪些算法希望输入有序数据

    Effective STL 学习笔记 Item 34: 了解哪些算法希望输入有序数据 */--> div.org-src-container { font-size: 85%; font-fam ...

  7. Effective STL 学习笔记 32 ~ 33

    Effective STL 学习笔记 32 ~ 33 */--> div.org-src-container { font-size: 85%; font-family: monospace; ...

  8. Effective STL 学习笔记 31:排序算法

    Effective STL 学习笔记 31:排序算法 */--> div.org-src-container { font-size: 85%; font-family: monospace; ...

  9. Effective STL 学习笔记 Item 30: 保证目标区间足够大

    Effective STL 学习笔记 Item 30: 保证目标区间足够大 */--> div.org-src-container { font-size: 85%; font-family: ...

随机推荐

  1. DragRigidbody2D

    组件源码 using UnityEngine; using System.Collections; //This script allows to drag rigidbody2D elements ...

  2. Mecanim 学习概述

    前言 我要逐个击破Unity中的知识点,包括1.Mecanim 2.NavMesh 3.4.3之后新的GUI系统 4.新的2D功能 5.Shader 6.性能及后期处理 早在2013年初的时候就听说过 ...

  3. SVN和git的使用(附github的简单玩法)

    今天简单的总结了下SVN和git的使用,也尝试了下github,应该好好提高下自己的英文水平了,梦想有一天不再使用任何翻译软件. [svn]:集中式的代码管理工具(版本控制工具--版本记录) 1> ...

  4. CSS3弹性伸缩布局(一)——box布局

    CSS3弹性伸缩布局简介 2009年,W3C提出了一种崭新的方案----Flex布局(即弹性伸缩布局),它可以简便.完整.响应式地实现各种页面布局,包括一直让人很头疼的垂直水平居中也变得很简单地就迎刃 ...

  5. Java 操作 Redis 高级

    /Users/sherry/WorkPath/Git/Web/redisDemo/src/main/java/org/zln/utils/JedisUtils.java package org.zln ...

  6. Linux中查看各文件夹大小命令du -h --max-depth=1

    http://blog.csdn.net/ouyang_peng/article/details/10414499 du -h --max-depth=1  

  7. C语言 Linux内核链表(企业级链表)

    //Linux内核链表(企业级链表) #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> ...

  8. 搭建Apache+MySQL+PHP环境

    1.1 搭建Apache+MySQL+PHP环境 1.1.1 关于安装前的准备 配置好yum源(/etc/yum.repos.d/)目录下,不会就去寻求运维支持. httpd-2.2.29.tar.g ...

  9. 从0开始学Java——从jsp到servlet转换的各种辅助元素介绍

    1. 指示元素,<%@指示元素 [属性=值]* %> 其中指示元素包括page, include, 和tablib三个. 其中  属性=值 可以有多对. 其中page用来告知容器如何转译目 ...

  10. [CareerCup] 5.3 Next Binary Representation 下一个二进制表达

    5.3 Given a positive integer, print the next smallest and the next largest number that have the same ...