string
substr
substr有2种用法:
假设:string s = "0123456789";
string sub1 = s.substr(5); //只有一个数字5表示从下标为5开始一直到结尾:sub1 = "56789"string sub2 = s.substr(5, 3); //从下标为5开始截取长度为3位:sub2 = "567"
find
//find 函数 返回jk 在s 中的下标位置 position = s.find("jk"); if (position != s.npos) //如果没找到,返回一个特别的标志c++中用npos表示,我这里npos取值是4294967295
s.find_first_of(flag)返回子串出现在母串中的首次出现的位置。
s.find_last_of(flag);返回子串出现在母串中的最后一次出现的位置。
s.find(b,5);查找某一给定位置后的子串的位置//从字符串s 下标5开始,查找字符串b ,返回b 在s 中的下标
//查找s 中flag 出现的所有位置。 flag="a"; position=0; int i=1; while((position=s.find(flag,position))!=string::npos) { cout<<"position "<<i<<" : "<<position<<endl; position++; i++; }
反向查找子串在母串中出现的位置,通常我们可以这样来使用,当正向查找与反向查找得到的位置不相同说明子串不唯一。//反向查找,flag 在s 中最后出现的位置 flag="3"; position=s.rfind (flag); printf("s.rfind (flag) :%d\n",position);
pair
一、Pair类型概述
pair是一种模板类型其中包含两个数据值,两个数据的类型可以不同,基本的定义如下:
pair<int, string> a;
表示a中有两个类型,第一个元素是int型的,第二个元素是string类型的。
如果创建pair的时候没有对其进行初始化,则调用默认构造函数对其初始化。
pair<string, string> a("James", "Joy");
也可以像上面一样在定义的时候直接对其初始化。
由于pair类型的使用比较繁琐,因为如果要定义多个形同的pair类型的时候,可以时候typedef简化声明:
typedef pair<string, string> author; author pro("May", "Lily"); author joye("James", "Joyce");
二、Pair对象的操作
1、对于pair类,由于它只有两个元素,分别名为first和second,因此直接使用普通的点操作符即可访问其成员
pair<string, string> a("Lily", "Poly"); string name; name = pair.second;
2、生成新的pair对象
可以使用make_pair对已存在的两个数据构造一个新的pair类型:
int a = 8; string m = "James"; pair<int, string> newone; newone = make_pair(a, m);
iterator
1. 迭代器(iterator)是一中检查容器内元素并遍历元素的数据类型。
(1) 每种容器类型都定义了自己的迭代器类型,如vector:
vector<int>::iterator iter;这条语句定义了一个名为iter的变量,它的数据类型是由vector<int>定义的iterator类型。
(2) 使用迭代器读取vector中的每一个元素:vector<int> ivec(10,1); for(vector<int>::iterator iter=ivec.begin();iter!=ivec.end();++iter) { *iter=2; //使用 * 访问迭代器所指向的元素 }
const_iterator:
只能读取容器中的元素,而不能修改。
at
假设v是一个vector对象,则v.at(n)和v[n]是一样的,只不过前者会检查是否越界(因此花费的时间稍多),而后者不会(后者越界会导致未定义行为)。
STL提供的容器中:
array、deque、vector不能通过operator[]()向容器中添加元素。
map、unordered_map类可以通过operator[]向容器中添加元素。
以上容器均不能通过at()函数向容器重添加元素。
at()函数在被调用时,会检查下标的有效性(与容器的size()比较而不是capacity()(例如vector)),若下标有效则返回对应位置的元素,否则抛出std::out_of_range异常。
operator[]()函数在被调用时,不检查下标的有效性。
例外:对于array而言,无论使用operator[]还是at()都会做下标有效性检查
容器
#include<vector> vector<int> v; vector<int> v1(v); //用另一个vector来初始化 vector<int> v2(n, i); //大小为n,并全部初始化为元素i v.push_back(int); // 尾部插入数字 v.empty(); //判断是否为空,为空返回true,否则返回false; v.resize(n+m); //调整vec的大小变为n+m v.insert(v.begin(),8);//在最前面插入新元素。 v.insert(v.begin()+2,1);//在2位置插入一个1 v.insert(v.end(),3);//在向量末尾追加新元素 v.insert(v.end(),4,1);//在尾部插入4个1 vec.erase(v.begin()+2);//删除第3个元素 v.erase(v.begin()+i,v.end()+j);//删除区间[i,j-1]; v.clear(); //清空之后,v.size()为0 v.reverse(vec.begin(),vec.end()); //使用reverse将元素翻转:需要头文件#include<algorithm> #include<string> string &substr(int pos = 0,int n = npos) const;//返回pos开始的n个字符组成的字符串 string &assign(const string &s,int start = 0,int n = len);//把字符串s中从start开始的n个字符赋给当前字符串 string &assign(const char *s,int n = len);//用c字符串s开始的n个字符赋值 string &append(const char *s,int n = len);//把c类型字符串s的前n个字符连接到当前字符串结尾 string &append(const string &s,int pos = 0,int n = len);//把字符串s中从pos开始的n个字符连接到当前字符串的结尾 int compare(const char *s) const; int compare(int pos, int n,const char *s) const; int compare(int pos, int n,const string &s,int pos2,int n2)const;//比较当前字符串从pos开始的n个字符组成的字符串与s中pos2开始的n2个字符组成的字符串的大小 void swap(string &s2); //交换当前字符串与s2的值 int find(const char *s, int pos = 0, int n = len) const;//从pos开始查找字符串s中前n个字符在当前串中的位置 int find(const string &s, int pos = 0) const;//从pos开始查找字符串s在当前串中的位置 //查找成功时返回所在位置,失败返回string::npos的值 int rfind(const char *s, int pos = 0, int n = len) const; int rfind(const string &s,int pos = len) const; //从pos开始从后向前查找字符串s中前n个字符组成的字符串在当前串中的位置,成功返回所在位置,失败时返回string::npos的值 int find_first_of(const char *s, int pos = 0, int n = len) const; int find_first_of(const string &s,int pos = 0) const; //从pos开始查找当前串中第一个在s的前n个字符组成的数组里的字符的位置。查找失败返回string::npos int find_first_not_of(const char *s, int pos,int n) const; int find_first_not_of(const string &s,int pos = 0) const; //从当前串中查找第一个不在串s中的字符出现的位置,失败返回string::npos string &replace(int p0, int n0,const char *s, int n = len);//删除p0开始的n0个字符,然后在p0处插入字符串s的前n个字符 string &replace(int p0, int n0,const string &s, int pos, int n);//删除p0开始的n0个字符,然后在p0处插入串s中从pos开始的n个字符 string &replace(int p0, int n0,int n, char c);//删除p0开始的n0个字符,然后在p0处插入n个字符c string &insert(int p0,const string &s, int pos, int n);//前4个函数在p0位置插入字符串s中pos开始的前n个字符 string &insert(int p0, int n, char c);//此函数在p0处插入n个字符c string &erase(int pos = 0, int n = len);//删除pos开始的n个字符,返回修改后的字符串 #include<bitset> bitset<MAXN> b; // bt 包括 MAXN 位,下标 0 ~ MAXN - 1,默认初始化为 0 bitset<MAXN> b(0xf); // 0xf 表示十六进制数 f,对应二进制 1111,将 bt1 低 4 位初始化为 1 bitset<MAXN> b(012);// 012 表示八进制数 12,对应二进制 1010,即将 bt2 低 4 位初始化为 1010 bitset<MAXN> b("1010");// 将 bt3 低 4 位初始化为 1010 bitset<MAXN> b(sring, pos, len); //将string类从pos开始的len个字符赋给b b(s, pos, n);// 将 01 字符串 s 的 pos 位开始的 n 位初始化 bt4 bt.any();// bt 中是否存在置为 1 的二进制位? bt.none();// bt 中不存在置为 1 的二进制位吗? bt.count(); // bt 中置为 1 的二进制位的个数 bt.size(); // bt 中二进制位的个数 bt[pos];// 访问 bt 中在 pos 处的二进制位 bt.test(pos);// bt 中在 pos 处的二进制位是否为 1 bt.set();// 把 bt 中所有二进制位都置为 1 bt.set(pos, val = 1); // 把 bt 中在 pos 处的二进制位置为 1 bt.reset(); // 把 bt 中所有二进制位都置为 0 bt.reset(pos);// 把 bt 中在pos处的二进制位置为0 bt.flip();// 把 bt 中所有二进制位逐位取反 bt.flip(pos);// 把 bt 中在 pos 处的二进制位取反 bt[pos].flip();// 同上 bt.to_ulong();// 用 bt 中同样的二进制位返回一个 unsigned long 值 bt.to_string();// 转化为string类 os << bt;// 把 bt 中的位集输出到 os 流 #include<queue> //priority_queue q.size();//返回q里元素个数 q.empty();//返回q是否为空,空则返回1,否则返回0 q.push(k);//在q的末尾插入k q.pop();//删掉q的第一个元素 q.top();//返回q的第一个元素 q.back();//返回q的末尾元素 priority_queue <int,vector<int>,greater<int> > q; //注意后面两个“>”不要写在一起,“>>”是右移运算符 priority_queue <int,vector<int>,less<int> >q; //less是从大到小,greater是从小到大