重拾C++ 基础知识总结(二)
1、标准库string类型:
用户程序要使用string类型对象,必须包含相关头文件 #include <string>
字符串字面值与标准库string类型不是同一种类型,字符串字面值是字符数组,而string是对象
2、
int main(){
string s;
cin>>s;
cout<<"s="<<s<<endl;
}
string类型的输入操作符:
读取并忽略开头所有的空白字符;读取字符直至再次遇到空白字符,读取终止(即只读取一个单词)
// 读取多个字符串,直至遇到文件尾
int main(){
string s,result;
while(cin>>s)
result += s;
cout<<"result="<<result<<endl;
}
3、getline()函数读取整行文本(接受两个参数,一个输入流对象和一个string对象,getline函数并不会忽略开头的换行符但会忽略尾部的换行符)
int main(){
string line;
while(getline(cin,line))
cout<<"line="<<line<<endl;
}
string对象重载了运算符 + = == != >= <= < > []
其中 s[] 返回s中位置为n的字符,位置从0开始计数
另外还有函数 s.empty() 判断字符串是否为空串, 函数 s.size() 返回字符的个数
s.size()函数的返回值:string::size_type类型,任何存储string的size操作结果变量必须为string::size_type类型,不要把size的返回值赋给一个int变量(使用配套类库类型string::size_type可以做到与机器无关,string::size_type是unsigned的)
4、string对象重载了运算符 + = == != >= <= < > []
其中关系操作符 > < >= <= 是区分大小写的,大写字母排在小写字母前面
如果两个string对象的字符不同,则比较第一个不匹配的字符
赋值操作符 = st1=st2
必须先把st1占用的相关内存释放掉,然后再分配st1足够存放st2副本的内存空间,最后把st2中的所有字符复制到新分配的内存空间中
两个string相加
下面把两个string对象连接起来产生第三个string对象
string s3 = s1 + s2;
string对象与字符串字面值的连接(+操作符的左右操作数必须至少有一个是string类型的):
string s1 = "hello";
string s2 = "world";
string s3 = s1 + ",";
string s4 = "hello" + ","; // 错误,因为没有string对象
string s5 = "s1 + "," + "world";
string s6 = "hello" + "," + s2; // 错误,因为前两个都是字符串字面值
从string获取字符
string类型通过下标获取字符([]运算符重载)
5、字符处理(cctype头文件):
isalnum(c) 判断字符是否是字母或数字
isalpha(c) 判断c是否是字符
iscntrl(c) 判断c是否为控制字符
isdigit(c) 判断c是否为数字
isgraph(c) 判断是否为空格,但可以打印
islower(c) 判断是否是小写
isprint(c) 判断是否可打印
ispunct(c) 判断是否是标点
isspace(c) 判断是否是空白字符
issupper(c) 判断是否是大写
isxdigit(c) 判断是否是十六进制数
tolower(c) 如果是大写转为小写
toupper(c) 如果是小写转为大写
6、c标准库头文件的c++版本
c++标准库除了定义了一些特定于c++的设施外,还包括c标准库。c++中的头文件cctype其实就是利用了c标准库函数,这些库函数就定义在c标准库的ctype.h头文件中。
c标准库头文件命名形式为name.h,而c++版本则命名为cname,少了后缀.h而在头文件名前加了c。c表示这个头文件源自c标准库。因此,cctype与ctype.h文件的内容是一样的,只是采用了更适合c++程序的形式。特别的,cname头文件中定义的名字都定义在命名空间std内,而.h版本中的名字却不是这样。
通常,c++程序中应采用cname这种头文件的版本,而不采用name.h版本,这样,标准库中的名字在命名空间std中保持一致。使用name.h版本会给程序员带来负担,因为他们必须记住哪些标准库名字是从cc继承来的,哪些是c++所持有的。
7、标准库vertor类型
vertor是同一类型的对象的集合,每个对象都有一个对应的整数索引值。它可以包含其他对象,一个容器中的所有对象都必须是同一类型的。(头文件 #include <vertor>)
vertor是一个类模版(不是一种数据类型),使用模版可以编写一个类定义或函数定义,而用于多个不同的数据类型
vertor<int> ivec;
vertor<Sales_item> Sales_vec;
8、vector对象的定义与初始化:
vertor构造函数
vertor<T> v1;
vertor<T> v2(v1);
vertor<T> v3(n,i); // v3包含n个值为i的元素
vertor<T> v4(n); // v4含有值初始化(默认初始化)的元素的n个副本
vertor<int> ivec(10,3) // 初始化包含10个3的vertor
vertor对象的动态增长:vertor可以在运行时高效地添加元素,有效的方法就是先初始化一个空的vertor对象,然后动态的增加元素
9、值初始化:内置类型数据有默认初始化值,对于自定义的类型,要使其可以自动初始化,就要提供一个默认的构造函数(无参构造函数)
10、vertor对象的操作:
v.empty() // 判断vertor是否为空
v.size() // 返回vertor的元素个数(返回类型应总是包括vertor的元素类型为vertor<T>::size_type,vertor::size_type是不正确的)
v.push_bach(t) // 在vertor的末尾增加一个值t的元素(动态添加元素)
v[n] // 返回vertor中位置为n的元素(元素由0开始计算)
v1 = v2; // 将v1中的元素替换为v2中的元素的副本
v1 == v2; // 比较两个vertor是否相等
!=, <, <=, >, >=
11、
for(vertor<int>::size_type ix = 0; ix != ivec.size(); ++i){
ivec[ix] = 0;
}
c++中习惯优先选用!=而不是<来编写循环判断条件
另外,for循环中没有保存ivec.size()的值,而是使用了函数表示结束的标识;在每次循环中测试size的当前值,而不是在进入循环前,存储size值的副本(vertor是可以动态的添加元素的,所以使用函数判断结束标识更安全)
12、c++中的vertor的下标操作不可以添加元素,下标只能用于获取已存在的元素(或者修改已存在的元素的值),应该使用push_back()函数向vertor中添加元素;
试图获取不存在的下标元素时会产生一个运行时错误,不能确保执行过程中可以捕捉到这类错误,运行程序的结果往往是不确定的
13、迭代器:
除了使用下标访问vertor的元素之外,还可以使用迭代器
头文件 #include <iterator>
每种容器类型都定义了自己的迭代器类型
vertor<int>::iterator iter;
每种容器都定义了一对命名为begin和end的函数,用于返回迭代器,如果有元素则begin返回的迭代器指向第一个元素
vertor<int>::iterator iter = ivec.begin();
由end操作返回的迭代器并不返回指向vertor中任何实际的元素,相反,它只起到一个哨兵的作用,表示已经处理完vertor中所有的元素
迭代器类型可通过解引用操作符(*操作符)来访问迭代器所指向的元素:
*iter = 0; // *iter 与 iter[0]指相同的元素
++iter; // 迭代器的自增操作,指向下一个元素
解引用操作符返回迭代器当前所指向的元素(不能对end迭代器进行解引用或自增操作)
迭代器的== 和 != 操作可以比较两个迭代器是否指向同一个元素
迭代器在vertor的应用
for(vector<int>::iterator iter = ivec.begin(); iter != ivec.end(); iter++){
*iter = 0;
}
14、const_iterator(只读迭代器,只用于读取容器中的元素,不能改变其值)
const_iterator 与 const迭代器的区别,const的迭代器一旦被初始化就不能改变其指向的迭代器,而可以改变其迭代器对应的值
15、迭代器的算术运算:
iter+n iter-n 可以直接定位到元素
iter1-iter2 得到的数据为different_type的signed类型的值
获取中间元素的迭代器:vector<int>::iterator mid = vi.begin() + vi.size()/2;
任何改变vector长度的行为都会导致已存在的迭代器失效
16、bitset类型(头文件 #include <bitset>):
bitset类型对象的区别在于其长度而不是其类型,在定义bitset时,要明确bitset含有多少位,须在尖括号内给出它的长度值
bitset<32> bitvec; // 32位的0
string对象和bitset对象之间是反向转化的,string对象的最右边字符(下标最大的字符)用来初始化bitset对象的低阶位(下标为0的位)
重拾C++ 基础知识总结(二)的更多相关文章
- 重拾C++ 基础知识总结(一)
1.使用gcc编译c++文件报错 proc1.cc:(.text+0x14): undefined reference to `std::cout' C++程序使用gcc命令只能编译,不能链接库文件 ...
- Java JDBC的基础知识(二)
在我的上一篇Java JDBC的基础知识(一)中,最后演示的代码在关闭资源的时候,仅仅用了try/catch语句,这里是有很大的隐患的.在程序创建连接之后,如果不进行关闭,会消耗更多的资源.创建连接之 ...
- LeetCode刷题191130 --基础知识篇 二叉搜索树
休息了两天,状态恢复了一下,补充点基础知识. 二叉搜索树 搜索树数据结构支持许多动态集合操作,包括Search,minimum,maximum,predecessor(前驱),successor(后继 ...
- Ajax基础知识(二)
接上一篇 Ajax基础知识(一) 在上一篇博客里,抛弃了VS中新建aspx页面,拖个button写上C#代码的方式.使用ajax的方式,异步向服务器请求数据.我们让服务器只简单的返回一个" ...
- HTTP基础知识(二)
接着上一章的内容:HTTP基础知识(一) 二.简单的HTTP协议 1.客户端:请求访问文本或图像等资源的一端称为客户端: 服务器端:提供资源响应的一端 2.以百度为例子 这是请求头: 在起始行 ...
- XML的相关基础知识分享(二)
前面我们讲了一下XML相关的基础知识(一),下面我们在加深一下,看一下XML高级方面. 一.命名空间 1.命名冲突 XML命名空间提供避免元素冲突的方法. 命名冲突:在XML中,元素名称是由开发者定义 ...
- python基础知识(二)
以下内容,作为python基础知识的补充,主要涉及基础数据类型的创建及特性,以及新数据类型Bytes类型的引入介绍
- Android中的一些基础知识(二)
这几天在回顾Android的基础知识,就把一些常见的知识点整理一下,以后忘了也可以翻出来看一看. 简单介绍一下Activity的生命周期 在API文档中对生命周期回调的函数描述的很详细,这里我只是翻译 ...
- 《Java从入门到失业》第一章:计算机基础知识(二):计算机组成及基本原理
1.2计算机组成及基本原理 1.2.1硬件组成 这里说的计算机主要指微型计算机,俗称电脑.一般我们见到的有台式机.笔记本等,另外智能手机.平板也算.有了一台计算机,我们就能做很多事情了,比如我在写这篇 ...
随机推荐
- div大小如何改变设置
如果改变更改div大小尺寸. 首先我们要知道DIV大小是由高和宽确定,要修改DIV容积大小我们设置css宽度和css高度即可实现改变DIV盒子大小. 一.改变div大小实例 为了实验便于观察DIV盒子 ...
- Apache HTTP Server mod_session_dbd 远程安全漏洞(CVE-2013-2249)
漏洞版本: Apache 2.4.2 漏洞描述: BUGTRAQ ID: 61379 CVE(CAN) ID: CVE-2013-2249 Apache HTTP Server是开源HTTP服务器. ...
- [Poetize II]太鼓达人
描述 Description 鼓的主要元件是M个围成一圈的传感器.每个传 感器都有开和关两种工作状态,分别用1和0表示.显然,从不同的位置出发沿顺时针方向连续检查K个传感器可以得到M个长度为K的01串 ...
- (转载)调用ob_end_flush()网页仍旧不能显示有关问题
(转载)http://www.myexception.cn/php/558638.html 调用ob_end_flush()网页仍旧不能显示问题?写了一个简单的demo,理论上调用ob_end_flu ...
- (转载)HTML标签<br><br/>的区别在哪里?
(转载)http://zhidao.baidu.com/question/259205863.html HTML标签<br><br/>的区别在哪里? 如果一样为什么还要分2个标 ...
- 组合数学(Pólya计数原理):UvaOJ 10601 Cubes
Cubes You are given 12 rods of equal length. Each of them is colored in certain color. Your task is ...
- 线段树(区间维护):HDU 3308 LCIS
LCIS Time Limit: 6000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- SRM 504.5(2-1000pt)
DIV2 1000pt 题意:一群人排队,每次操作由要骰子决定,只要没有人中奖,游戏就不结束.若摇骰子摇出4,则队列第一个人中奖:否则,若摇的是奇数,则第一个人排队到队伍末尾去:否则,第一个人出局.若 ...
- Linux 守护进程的启动方法
守护进程”(daemon)就是一直在后台运行的进程(daemon). 本文介绍如何将一个 Web 应用,启动为守护进程. 一.问题的由来 Web应用写好后,下一件事就是启动,让它一直在后台运行. 这并 ...
- 跳跃表Skip List【附java实现】
skip list的原理 Java中的LinkedList是一种常见的链表结构,这种结构支持O(1)的随机插入及随机删除, 但它的查找复杂度比较糟糕,为O(n). 假如我们有一个有序链表如下,如果我们 ...