5.容器配接器和字符串

来源:互联网 发布:大数据产业测度 编辑:程序博客网 时间:2024/06/06 01:49

C++ 标准程序库还提供了三种容器配接器。


1.Stacks(堆栈)
2.Queue(队列)

3.Priority queues(带优先序的队列)


容器适配器不提供迭代器操作。


此外这里还介绍一个叫bitset的特殊容器。


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);//输出:0111cout << a << endl;long l = 10;bitset<4> b(l);//输出:1010cout << b << endl;string str("1100");bitset<4> c(str);//输出:1100cout << c << endl;c.flip(0);//输出:1101cout << 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中的函数命名方法不相同!


0 0