每个名字都需要一个using声明,但是有一种情况,必须总是使用完全限定的标准库名字:在头文件中。理由是,在头文件中放置using声明,就相当于在包含该头文件的所有程序中都放置了同一using声明。
千万注意,string类型与字符串字面值不是同一类型。string对象最后没“\n”。
#include
using std::string;
string s1; //默认构造函数
string s2 (s1); //将s2初始化为s1的一个副本
string s3 (“value”); //将s3初始化为字符串字面值的一个副本
string s4 (n, ‘c’); //将s4初始化为n个字符’c’的副本
(1)标准输入读取string:
读取并忽略开头所有空白字符(空格、换行符、制表符);
读取字符直至再次遇到空白符为止。
(2)用getline读取整行文本:
istream getline (istream cin, string line);
不忽略开头的换行符,只要遇到换行符就停止,不保存最后的换行符。即便它是第一个输入符,line被置为空sting。
string s; //s为字符组对象
(1)s.size(),返回字符串s中字符的个数,其数据类型不是整型,而是string::size_type类型(是一个unsigned类型)。不能把size的返回值赋给一个int变量。
(2)s.empty(),返回字符串s是否为空的布尔值。
(3)支持关系操作符<,<=,>,>=。比较时采用和(大小写敏感)字典排序相同的策略。
(4)支持赋值操作,但是确实存在效率问题。
(5)支持两个string对象相加。
(6)支持和字符串字面值的连接。当进行string对象和字符串字面值混合连接时,+操作符的左右操作数必须至少一个是string类型。
string s1 (“hello, ”); string s2 (“world\n”); string s3 = s1 +s2;
string s1 (“hello”); string s3 = s1 + “, world”; //效果等同于上一行!
(7)支持下标操作,从0开始,s[s.size() - 1]是最后一个字符。并且下标操作可用作左值,更改字符串的某个字符。索引值应该用sting::size_type类型变量,这样保证索引值不小于0,并且会自动检测不超过上界s.size() – 1。
对单个字符的操作函数,在cctype头文件中!
isalnum(c) //是数字或者字母,则为true; isalpha(c) //是字母,则为true;
iscntrl(c) //控制符 isdigit(c) //数字 isgraph(c) //不是空格,但可打印
islower(c) //小写 isupper(c) //大写 isprint() //可打印字符
ispunct(c) //标点符号 isspace(c) //空白字符
tolower(c) //转为小写 toupper(c) //转为大写
vector是同一种类型的对象集合,属于容器的一种。vector只是一个类模板,可以指定任意类型的对象,比如: vector
#include
using std::vector;
vector
vector
vector
vector
vector对象的重要属性就在于可以在运行时高效地添加元素,后续详解。
(1)v.empty()和v.size(),赋值,比较等等操作。
(2)v.push_back(T val); 将新值插入到vector对象v的后面。
(3)vector的下标操作只能进行对已有元素的索引,不能进行添加元素操作。
除了使用下标来访问vector对象的元素,标准库还提供了迭代器访问元素的方法。迭代器是一种检查容器内元素并遍历元素的数据类型。所有标准库容器都定义了相应的迭代器类型!
vector
如果容器中有元素的话,由begin返回的迭代器指向第一个元素:
vector
由end操作返回的迭代器指向vector的末端元素的下一个,指向一个不存在的元素。如果vector为空,则begin和end返回的迭代器相同。end只是起个哨兵作用,表示已处理完vector中所有元素。
迭代器使用解引用操作符(*)来访问迭代器所指向的元素:
*iter = 0;
++iter; //表示指向下一个元素
如果两个迭代器指向同一个元素,那么久==,否则为!=。
for(vector
*iter= 0;
每个容器还定义了一种名为const_iterator的类型,只能用于读取容器内的元素,但不能改变其值。
当我们对普通iterator类型解引用时,得到对某个元素的非const引用。而如果对const_iterator类型解引用时,则可以得到一个指向const对象的引用。
vector
iter1– iter2; 用于计算两个迭代器对象的距离,是名为difference_type的signed类型的值。与size_type类型类似,但是是有符号的。
iter + n; 加减的值不是整型,而是size_type或者difference_type。
vector
热河改变vector长度的操作都会使已存在的迭代器失效。例如,在调用push_back之后,就不能再信赖指向vector的迭代器的值了。
bitset类简化二进制位的有序集(都是0,1)的处理。bitset也是一种类模板,但是其尽在长度上有区别,如bitset<32> bitvec;。
#include
using std::bitset;
bitset
bitset
bitset
bitset
注:当用string对象初始化bitset对象时,从string对象读入位集的顺序是从右向左:
string strval (“1100”); bitset<32> bitvec (strval);
bitset中第2,3位是1,其余都为0。
(1)b.any(); //b中是否存在置为1的位? b.none(); //b中全0?
b.count(); //b中位为1的个数 b.size(); //b中的总位数
count和size返回的值类型都为size_t类型,定义在cstddef头文件中,也是一个unsigned有关的类型,其大小足以保证存储内存中对象的大小。
(2)b[pos]; //下标操作 b.text(pos);//下标为pos位是否为1?
b.set();//所有位都置1 b.reset(); //所有位都置0 b.flip(); //所有位都取反
b.set(pos);//pos位置1 b.reset(pos);//pos位置0 b.flip(pos);//pos位取反
(3)b.to_ulong(); //用b中同样的二进制位返回一个unsigned long值
os<< b; //把b中的位集输出到os流。
bitset<32> bitvec (0xffff);
cout<< “bitvec: ” << bitvec << endl; //输出结果