c++ primer 笔记 (三)

标准库类型string 和 vector ,分别定义了大小可变的字符串和集合。
                bitset,提供了一个抽象方法来操作位的集合。提供更方便的处理位的方式(相对于整型值上的位操作符)
 
vector用于保存一组指定类型的对象。
 
::作用域操作符    ----  右操作数的名字可以在左操作数的作用域中找到。
 
using声明
 
使用标准库类型的定义
有一种情况下,必须总是使用完全限定的标准库名字:在头文件中。
理由是头文件的内容会被预处理器复制到程序中。用#include包含文件时,相当于头文件中的文本将成为我们编写文件的一部分。如果在头文件中放置using声明,就相当于在包含该头文件的每个程序中都放置了同一using声明,不论该程序是否需要using声明。
 
通常,头文件中应该只定义确实必要的东西。
 
字符串字面值与标准库string类型不是同一种类型。
 
string s;
cin >> s; // 读取并忽略开头所有的空白字符(如空格,换行符,制表符)
              //  读取字符直至再次遇到空白字符,读取终止
              // "    Hello  world! " ---->>>>  Hello
 
1.读入未知数目的string对象
把输入操作作为判断条件
while(cin >> word)
 
2.用getline读取整行文本(并不忽略行开头的换行符
getline(cin,line)从输入流的下一行读取,并保存读取的内容到string中,不包括换行符
一个输入流对象和一个string对象
 
getline函数返回时丢弃换行符,换行符将不会存储在string对象中
 
s.size()  s.empty()  s[n]  s1 + s2  
s1 = s2 v1 == v2
 
size操作返回的是string::size_type类型的值
string类类型和许多其他库类型都定义了一些配套类型(companion type)。通过这些配套类型,库类型的使用就能与机器无关(machine-independent)
 
定义为与unsigned型具有相同的含义(不知道确切类型),而且可以保证足够大能够存储任意string对象长度。
 
不要把size的返回值赋给一个int变量
 
***********网上找的例子***************

注意,任何存储string的size操作结果的变量必须为string::size_type类型。尤其不能把size的返回值赋给一个int变量。(因为size返回的是一个unsigned类型,而int是signed类型。size能表达的大小是int的2倍)。

string str("some string");   //通过字符串字面值赋值给串
for (string::size_type ix = 0; ix != str.size(); ++ix)   //此处不该为int     用!=,而不用<=
{
   cout<<str[ix]<<endl;
}

vector<int> ivec;
for(vector<int>::iterator ix = ivec.begin(); ix != ivec.end(); ++ix)   
                                                                        //此处不该为int     用!=,而不用<=

{
    *ix = 0; //将各个元素赋值为0
}
*********************************后来发现在书后面有这个例子
 
 
string st1, st2 = "The expense of spirit";
st1 = st2;   /replace st1 by a copy of st2
效率问题
.....1先把st1占用的相关内存释放掉
2分配给st1足够存放st2副本的内存空间
3把st2中的所有字符复制到新分配的内存空间。....
 
当进行string对象和字符串字面值混合连接操作时,+操作符的左右操作数必须至少有一个string类型的
 
string s1 = "hello";          // no punctuation
string s2 = "world"; 
string s3 = s1 + ", ";       // ok:adding a string and a literal
string s4 = "hello" + ", "; // error: no string operand
string s5 = s1 + ", " + "world"  // ok: each + has string operand
string s6 = "hello" + ", " + s2;  // error:can't add string literals
 
虽然任何整型数值都可作为索引,但索引的实际数据类型却是unsigned类型string::size_type
 
cctype头文件
isalnum(c)   isalpha(c)   iscntrl(c)   isdigit(c)  isgraph(c)不是空格,但可打印  islower(c)  isprint(c) 可打印 ispunct(c)标点   isspace(c)   isupper(c)  isxdigit(c)16进制数  tolower(c)  toupper(c)  
 
vector是同一种类型的对象的集合,每个对象都有一个对应的整数索引值。
 
和string对象一样,标准库将负责管理与存储元素相关的内存。
 
vector称为容器,因为它可以包含其他对象。
一个容器中的所有对象都必须是同一种类型的。
 
vector是一个类模板(class template)不是一种数据类型
可定义任意多种数据类型  vector<int>和vector<string>都是数据类型
 
vector<int> ivec;  //该类型含有int类型对象的vector,变量名为ivec
 
 
vector<int> ivec1;
vector<int> ivec2(ivec1);
vector<int> ivec4(10,-1);
vector<string>svec(10,'hi!');
 
vector对象的重要属性就在于可以在运行时高效地添加元素。
 
vector元素连续存储
 
初始化一个空vector对象,然后再动态地增加元素(更有效相比于对vector对象预先分配内存)
 
值初始化
1vector<int> fvec(10);  // 10 elements,each initialized to 0 内置类型  值为0
2vector<string> svec(10);  // 10 elements,each an empty string 默认构造函数
3元素类型可能是没有定义任何构造函数的类类型。标准库仍产生一个带初始值的对象,这个对象的每个成员进行了值初始化。
 
v.empty() v.size() v.push_back(t) v[n] v1 = v2 v1==v2
 
vector<int>::size_type
 
vector中的对象是没有命名的,可以按vector中对象的位置来访问它们。通常使用下标操作符来获取元素。
 
c++程序员习惯于优先选用!=而不是<来编写循环判断条件。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。后面会讲到
 
size()内联函数  
编译器遇到内联函数时就会直接扩展相应代码,而不是进行实际的函数调用。运行时代价较小
 
 
缓冲区溢出对不存在的元素进行下标操作的结果
 
迭代器是一种检查容器内元素并遍历元素的数据类型。
对所有容器都适用,下标不一定适用所有容器
vector<int>::iterator iter;
iter的数据类型是由vector<int>定义的iterator类型
 
每个容器都定义了一个名为iterator的类型,而这种类型支持(概念上的)迭代器的各种操作。
 
vector<int>::iterator iter = ivec.begin();
ivec.end()---->>指向了“末端元素的下一个”    一个不存在的元素 称为超出末端迭代器
 
如果vector为空,begin返回迭代器与end返回的迭代器相同
 
由end操作返回的迭代器并不指向vector中任何实际的元素,相反,它只是起一个哨兵(sentinel)的作用,表示我们已处理完vector中所有元素
 
解引用操作符(*操作符)来访问迭代器所指向的元素
*iter = 0;返回迭代器当前所指向的元素
若iter指向ivec第一个元素,则*iter = ivec[0]  指向同一个元素 ,值被赋为0。
 
for(vector<int>::iterator iter = ivec.begin();iter  != ivec.end();++ivec)
     *iter = 0;
 
const_iterator
能读不能写
 
P86。。。。。。。。。。。。。。。。。。。。。
 
bitset类型
bitset类型对象的区别仅在其长度而不在其类型。
bitset<32> bitvec; // 32bits,all zero
 
只能按位置来访问它们。
 
 
 
 
 
 
 
 
 
 
 
 
相对于C++内置数据类型的数组和指针而言,程序员应优先使用标准库类类型
上一篇:Django框架之第二篇--app注册、静态文件配置、form表单提交、pycharm连接数据库、django使用mysql数据库、表字段的增删改查、表数据的增删改查


下一篇:[ZJOI2009]染色游戏