C++ 学习笔记——标准库类型
一、string
1.定义与初始化
string s1; //默认构造函数,为空
string s2 ("it is a string"); // 初始化为字符串字面值的副本
string s3(s2); // 将S3初始化为S1的一个副本
string s4(n,'f'); //初始化为字符f的N个副本
*此处看到C++primer中对输入函数进行了讲解,通过实验后得出getline cin 的区别
代码1:
{ string s1("hello");
cout<<"Please input s1 :"<<endl;
while(getline(cin,s1))
cout<<s1;
return 0;
}
如果输入为: abc def gh i output: abc def gh i 此处第一个字符为空格
如果换成CIN输入的话,第一个字符不会被发现 输出为:abcdefghi
2.string 支持关系运算符,关系操作符比较两个string 对象时采用大小写敏感的字典排序策略
string 支持赋值,两个对象支持“+”运算,且“+”运算符支持直接和字符串字面值的运算,但“+”至少一端必须为string类型。
3.string 下标操作
A string 对象可以像数组一样进行下标操作,
void main(){2

3
string s1 ("I am a string!");4

5
for(string::size_type ix = 0;ix != s1.size(); ++ix)6

7
{cout<<s1[ix];8

9
}10

11
}12

B且下标操作可以用作左值,
string s1 ("I am a string!");
for(string::size_type ix = 0;ix != s1.size(); ++ix)
{ s1[ix]='*';
cout<<s1[ix];
}
C可以产生整型的任何操作都可以用作下标操作符的索引
int i1, i2;
s1[i1*i2];
4 string 对象中字符的处理
string 定义了一系列对字符的操作函数,定义在cctype头文件中,由于较多,这里不一一列出用法,主要功能为检测特定位上的字符是不是函数要求类型,返回值为bool型。
应用例子:
void main(){
string s2 ("hello , world!!!");
string::size_type cunt = 0;
for(string::size_type ix = 0;ix != s2.size();++ix)
{
if( ispunct(s2[ix]) ) //ispunct()用于判断()内是否为标点符号
++cunt;
}
cout<<cunt<<" punctuation characters in "<< s2;
}
此外还有tolower();toupper();等,不一一列举。
二、vector
vector是一个类模板,它可以包含其它类型,故又称之为容器。
1.定义与初始化
vector< T > v1;
vector< T > v2(v1);
vector< T > v3(n,c);
vector < T > v4(n);
vector 储存在连续的内存中,在初始化时先初始化一个空的对象然后再添加元素,如果动态添加中发现空间不够,则再申请一块连续的内存区域并把原来的对象复制过去后删除原来的对象。
2.vector对象操作
vector中提供了许多像string一样的操作,例如:v.size(); v.empty(); v.pushback();
向vector中添加新元素要用pushback();
vector的下标操作与string类似,可以参考上文。
!还有一点需要说明的是vector中只能对已经存在的元素进行下标操作。
三、迭代器--iterator
此处iterator有两层含义:1 迭代器,2 迭代器类型
若一种类型支持一组确定的操作,我们就称这种类型为迭代器。
1.定义迭代器 vector< int >:: iterator iter;
2 iterator 的自增与解引用运算
解引用操作符(*操作符)*iter = 0;//给iter指向的第一个元素赋值为0
如果iter 指向vector 对象 ivec 的第一个元素,那么*iter和 ivec[0]指向同一个元素。
如果iter指向ivec的第一个元素,那么一次++iter运算以后指向第二位,每运行一次自增运算iter指向的位置向后移动一位。
==与!=可用于迭代器
示例:用迭代器实现全赋值为0
for(vector< int > iterator iter = ivec.begin();iter != ivec.end;++iter)
{ *iter=0 ; }
3.const_iterator
指向可以变动,但是指向的元素不能变动
注意与const 型的 iterator 的区别。
4.迭代器的算术操作
如:iter - n; iter + n; iter1 - iter2;
!!!当容器改变时,迭代器不再可信。如: vector 进行 pushback()后,原来的iterator不再可信。
四、bitset
与前两者一样,此也为一类模板,使用时要包含:
#include <bitset>;
1.定义与初始化
与前两者不同的是在定义时要指明长度而不是类型,如:
bitset<32> bitvec; //32bits,all zero
几种初始化方法:
bitset<n> b;
bitset<n > b1 (u); //u为unsigned long 对象
bitset<n> b2 (s); //s为string的对象
bitset<n> b3(s, pos, n)
A用unsigned初始化
bitset<16> bitvec1(0xffff); //bit 1 to 15 is 1,由于16没有unsigned 长度长,所以高位放弃
bitset<32> bitvec2(0xffff); //from bit 1 to 15 is 1,16 to 31 is 0
bitset<128> bitvec3(0xffff);//多出的位置0
B用string初始化
读入方式为自右向左,如:
string s1 ("1100");
bitset<16> bitvec4(s1); //第二位与第三位为1,其余全为0
!!string 与 bitset 之间是反向转化,即string中高位(下标最大)来初始化bitset中的低位(下标为0)
string str ("11111100000110000010010")
bitset<32> bitvec5(str,5,4); //0011
bitset<32> bitvec6 (str,str.size()-4) //use last 4 bit
2.bitset对象上的操作
size_t cnt = bitvec.size();
bitset 支持下标操作。可以用来获取与变更
*输出二进制
bitset<32> bitvec (0xffff);
cout<<"bitvec:"<<bitvec<<endl; //000000000000001111111111111




浙公网安备 33010602011771号