标准库类型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++内置数据类型的数组和指针而言,程序员应优先使用标准库类类型

c++ primer 笔记 (三)的更多相关文章

  1. C++ Primer 笔记 第三章

    C++ Primer 第三章 标准库类型 3.1using声明 例: using namespace atd; using std::cin; 3.2string类型 初始化方式 string s1 ...

  2. C++ Primer笔记

    C++ Primer笔记 ch2 变量和基本类型 声明 extern int i; extern int i = 3.14;//定义 左值引用(绑定零一变量初始值,别名) 不能定义引用的引用:引用必须 ...

  3. Oracle学习笔记三 SQL命令

    SQL简介 SQL 支持下列类别的命令: 1.数据定义语言(DDL) 2.数据操纵语言(DML) 3.事务控制语言(TCL) 4.数据控制语言(DCL)  

  4. 《CMake实践》笔记三:构建静态库(.a) 与 动态库(.so) 及 如何使用外部共享库和头文件

    <CMake实践>笔记一:PROJECT/MESSAGE/ADD_EXECUTABLE <CMake实践>笔记二:INSTALL/CMAKE_INSTALL_PREFIX &l ...

  5. Mastering Web Application Development with AngularJS 读书笔记(三)

    第一章笔记 (三) 一.Factories factory 方法是创建对象的另一种方式,与service相比更灵活,因为可以注册可任何任意对象创造功能.例如: myMod.factory('notif ...

  6. Python 学习笔记三

    笔记三:函数 笔记二已取消置顶链接地址:http://www.cnblogs.com/dzzy/p/5289186.html 函数的作用: 給代码段命名,就像变量給数字命名一样 可以接收参数,像arg ...

  7. 《MFC游戏开发》笔记三 游戏贴图与透明特效的实现

    本系列文章由七十一雾央编写,转载请注明出处. 313239 作者:七十一雾央 新浪微博:http://weibo.com/1689160943/profile?rightmod=1&wvr=5 ...

  8. [Firefly引擎][学习笔记三][已完结]所需模块封装

    原地址:http://www.9miao.com/question-15-54671.html 学习笔记一传送门学习笔记二传送门 学习笔记三导读:        笔记三主要就是各个模块的封装了,这里贴 ...

  9. JSP学习笔记(三):简单的Tomcat Web服务器

    注意:每次对Tomcat配置文件进行修改后,必须重启Tomcat 在E盘的DATA文件夹中创建TomcatDemo文件夹,并将Tomcat安装路径下的webapps/ROOT中的WEB-INF文件夹复 ...

  10. 构建高性能WEB站点笔记三

    构建高性能WEB站点笔记三 第10章 分布式缓存 10.1数据库的前端缓存区 文件系统内核缓冲区,位于物理内存的内核地址空间,除了使用O_DIRECT标记打开的文件以外,所有对磁盘文件的读写操作都要经 ...

随机推荐

  1. 转---python os.exec*()家族函数的用法

    execl(file, arg0,arg1,...) 用参数列表arg0, arg1 等等执行文件 execv(file, arglist) 除了使用参数向量列表,其他的和execl()相同 exec ...

  2. css颜色模式hsla和rgba

    在CSS3中可以使用RGBA和HSLA两种色彩模式,这两个都可以用来设置颜色以及指定透明度. rgba指的是:红色.绿色.蓝色.Alpha透明度(Red-Green-Blue-Alpha)前三个值取值 ...

  3. Lucene Query In Kibana

    1. Terms 一个查询由词条与操作组成.词条可以是单词,或者短语. hello #单独项 "hello pzdn" #双引号引起来短语 2. Field Lucene 支持字段 ...

  4. qemu基本使用

    1.qemu的安装 请参考家用路由器0day漏洞挖掘技术这本书 2.基本使用 qemu有主要如下两种运作模式: 用户模式(User Mode),亦称使用者模式.qemu能启动那些为不同中央处理器编译的 ...

  5. luogu P4778 Counting swaps

    计数套路题?但是我连套路都不会,,, 拿到这道题我一脸蒙彼,,,感谢@poorpool 大佬的博客的指点 先将第\(i\)位上的数字\(p_i\)向\(i\)连无向边,然后构成了一个有若干环组成的无向 ...

  6. pythonic语法

    b="$".join(str(x) for x in range(10)) a= 2 if 5<2 else 3 print (a)#a是3

  7. DropEditText

    https://blog.csdn.net/jdsjlzx/article/details/46860563    https://github.com/qibin0506/DropEditText ...

  8. SILC超像素分割算法详解(附Python代码)

    SILC算法详解 一.原理介绍 SLIC算法是simple linear iterative cluster的简称,该算法用来生成超像素(superpixel) 算法步骤: 已知一副图像大小M*N,可 ...

  9. SpringBoot与任务

    (1).异步任务 package cn.coreqi; import org.springframework.boot.SpringApplication; import org.springfram ...

  10. linux kernel的cmdline参数解析原理分析【转】

    转自:https://blog.csdn.net/skyflying2012/article/details/41142801 版权声明:本文为博主kerneler辛苦原创,未经允许不得转载. htt ...