C++ 标准程序库还提供了三种容器配接器。
2.Queue(队列)
3.Priority queues(带优先序的队列)
容器适配器不提供迭代器操作。
Stacks只提供5个成员函数。
1.push()
2.top()
3.pop()
4.empty()
5.size()
Queues提供六个成员函数。
1.push()
2.pop()
3.front()
4.back()
5.empty()
6.size()
priority_queue与set推荐使用set。
有些程序要处理二进制位的有序集,每个位可能包含 0(关)1(开)值。位是用来保存一组项或条件的 yes/no 信息(有时也称标志)的简洁方法。C++标准程序库提供的 bitset 类简化了位集的处理。
bitset对象右边是低位。
初始化方法:
1.bitset<n> b:b有n位,每一个是0
2.bitset<n> b(u):b是unsigned long型u的一个副本(这里是用unsigned long的二进制初始化)。
3.bitset<n> b(s):b是string类型s的一个副本。
#include <iostream>
#include <bitset>
using namespace std;
int main()
{
bitset<4> a(7);
//输出:0111
cout << a << endl;
long l = 10;
bitset<4> b(l);
//输出:1010
cout << b << endl;
string str("1100");
bitset<4> c(str);
//输出:1100
cout << c << endl;
c.flip(0);
//输出:1101
cout << c << endl;
cout << c.to_string() << endl;
cout << c.to_ullong() << endl;
return 0;
}
——————
string对象的搜寻函数返回的是一个整数而不是迭代器,所有搜寻函数返回的类型都是string::size_type类型,这是一种无符号的类型。第一个字符的索引值为0,最后一个字符的索引值为numberOfCharacters - 1,和C-String不同,string对象的字符串尾部没有特殊字符'\0'。
如果搜寻失败,必须返回一个特殊值表示,这个值是npos,一般写法是这样的:
if(idx != string::npos)
特别注意的是,如果打算检验搜寻函数的返回值是,应该使用string::size_type类型而不是int或者unsigned。
这里举一个例子,从输入装置取得一个个英文单词,然后将各个字符逆序输出。
如果分隔符只有空格,则可以这样:
#include <iostream>
#include <string>
#include <sstream>
#include <algorithm>
using namespace std;
int main()
{
string str;
string word;
while(getline(cin,str))
{
stringstream stream(str);
while(stream >> word)
{
reverse(word.begin(),word.end());
cout << word << " ";
}
cout << endl;
}
return 0;
}
但是如果分隔符有很多,如‘\t',',','.'等,这这种方法就行不通了。因为getline分隔单词只能用空格,可以用下面的程序。
#include <iostream>
#include <string>
#include <sstream>
#include <algorithm>
using namespace std;
int main()
{
const string delim(" \t,.;");
string line;
while(getline(cin,line))
{
string::size_type begIndex,endIndex;
begIndex = line.find_first_not_of(delim);
while(begIndex != string::npos)
{
endIndex = line.find_first_of(delim,begIndex);
if(endIndex == string::npos)
endIndex = line.size();
for(int i = endIndex - 1; i >= static_cast<int>(begIndex); --i)
cout << line[i];
cout <<' ';
begIndex = line.find_first_not_of(delim,endIndex);
}
cout << endl;
}
return 0;
}
注意上面的程序还是用的先find,再while循环,while循环里再find的方法。
string构造函数需要注意的有以下几个:
1.string s(cstr):以C-String cstr作为字符串s的初始值。
2.string s(cstr,chars_len):以C-String cstr前chars_len作为字符串的初值。(这种带len的参数形式是前n个字符)
3.string s(beg,end):以[beg,end)内的字符作为s的初值。
4.string s(s2,pos2):从下标pos2开始的字符拷贝
5.string s(s2,pos2,len2):从下标pos2开始len2个字符的拷贝。
string也可以用reserve()函数来避免重新分配内存,但string的reserve()可以缩减实际容量而vector则不可以,如果string需要减少长度,最快的方法就是用resize()删除元素。
把string类型转换为C-String类型直接调用c_str()函数。
string特有的版本(pos为下标):
1.s.insert(pos,s2)
在下标为pos的元素前插入s2。这里有可以引申为
s2,pos2,len:插入s2中pos2开始的len个字符。
注意insert()函数不接受索引+单个字符的模式。
2.s.erase(pos,len)
删除下标从pos开始的len个字符。
3.s.substr(pos,n)
返回一个字符串,包含s中从下标pos开始的n个字符。这里第二个参数可以省略。
4.s.replace(pos,len,args)
删除下标从pos开始的len个字符,用args代替。
5.s.append(args)
将args串接在s后面,注意只能增加字符串,不能增加字符,如果要加字符用push_back()函数。
args包括:
1.s2
2.s2,pos2,len
3.cp
4.cp,len
5,n,c
6.beg,end
string的搜寻函数:
1.find():搜寻第一个与value相等的字符。
2.rfind():搜寻最后一个与value相等的字符。
3.find_first_of():搜寻第一个与value中某值相等的字符。
4.find_last_of():搜寻最后一个与value中某值相等的字符。
5.find_first_not_of():搜寻第一个与value中任何值都不相等的字符。
6.find_last_not_of():搜寻最后一个与value中任何值都不相等的字符。
其中可以有三个参数,第一个参数总是被搜寻的对象,第二个参数为string内搜寻的起点。注意这里和STL中的函数命名方法不相同!