[C++ Primer] 第3章: 字符串, 向量和数组
标准库类型string
string初始化
string s2(s1);
string s2 = s1;
string s3("value");
string s3 = "value";
string s4(n, 'c'); // n个连续的c组成的字符串
读写string对象
读写未知数量的string对象
int main()
{
string word;
while(cin >> word)
cout << word << endl;
return 0;
}
使用getline读取一整行
int main()
{
string line;
while(getline(cin, line)) // line不含换行符, 第二个参数必须是string类型
cout << line << endl;
return 0;
}
size()返回类型为string::size_type, 推荐使用auto或者decltype推断变量的类型
auto len = line.size();
decltype(line.size()) len;
处理string中的字符
cctype头文件中的函数
函数 | 说明 |
---|---|
isalnum(int c) | 测试字符是否为英文或数字,在标准c中相当于使用isalpha(c)或 isdigit(c) |
isalpha(int c) | 检查参数c是否为英文字母 ,在标准c中相当于使用isupper(c)或islower(c) |
isascii(int c) | 检查参数c是否为ASCII码字符,也就是判断c的范围是否在0到127之间。 |
iscntrl(int c) | 检查参数c是否为ASCII控制码,也就是判断c的范围是否在0到30之间。 |
isdigit(int c) | 检查参数c是否为阿拉伯数字0到9。 |
isgraph(int c) | 检查参数c是否为可打印字符,若c所对映的ASCII码可打印,且非空格字符则返回TRUE。 |
islower(int c) | 检查参数c是否为小写英文字母。 |
isprint(int c) | 检查参数c是否为可打印字符,若c所对映的ASCII码可打印,其中包含空格字符,则返回TRUE。 |
isspace(int c) | 检查参数c是否为空格字符,也就是判断是否为空格('')、定位字符('\t')、CR('\r')、换行('\n')、垂直定位字符('\v')或翻页('\f')的情况。 |
ispunct(int c) | 检查参数c是否为标点符号或特殊符号。返回TRUE也就是代表参数c为非空格、非数字和非英文字母。 |
isupper(int c) | 检查参数c是否为大写英文字母。 |
isxdigit(int c) | 检查参数c是否为16进制数字,只要c为下列其中一个情况则返回TRUE。16进制数字:0123456789ABCDEF。 |
tolower(int c) | 如果c是大写字母则转成小写, 否则原样输出c |
toupper(int c) | 如果c是小写字母则转成大写, 否则原样输出c |
使用范围for循环处理每个字符
string s("Hello World!");
for(auto &c : s)
c = toupper(c); // c是一个引用, 因此赋值语句可以改变s中字符的值, 若无需改变s中的字符可以不使用引用
cout << s << endl;
注意: 当对字符串s使用下标操作单个字符时, 一般需要先判断s.empty()
标准库类型vector
定义和初始化
vector<T> v1;
vector<T> v2 = v1;
vector<T> v2(v1);
vector<T> v3(n, val); // 创建制定数量的元素, 包含n个重复元素, 每个元素的值都为val
vector<T> v4(n); // 包含n个重复的执行值初始化, 内置类型如int初始化为0
vector<T> v5{a, b, c};// C++11支持
vector<T> v5 = {a, b, c};
重要操作
v.empty()
v.size() // 返回类型为 std::vector<T>::size_type
v.push_back()
v1 = v2; // 用v2元素拷贝替换v1中元素
v1 = {a, b, c...}; // 用列表中元素拷贝替换v1中元素
v1 == v2; v1 != v2; // 其他逻辑运算符同理
注意: 只能对已存在的元素执行下标操作, 尽量使用范围for循环可以有效确保下标合法
迭代器介绍
所有标准库容器都可以使用迭代器(string对象不属于容器类型, 但也支持迭代器). 通过begin和end成员获取迭代器.
标准容器迭代器的运算符
*iter // 解引用, 返回迭代器所指元素的引用
iter->mem // 等价(*iter).mem
++iter
--iter
iter1 == iter2
iter1 != iter2
所有标准库容器的迭代器都定义了==和!=, 但是他们中的大多数都没有定义<运算符. 因此要养成使用迭代器和!=的习惯, 就不用太在意用的到底是那种容器.
迭代器类型: 使用iterator和const_iterator表示迭代器类型
vector<int>::iterator it; // 可读写
string::iterator it2;
vector<int>::const_iterator it3; // 只读
string::const_iterator it4;
若对象是常量, 则begin和end返回const_iterator, 否则返回iterator. 无论对象本身是否是常量, cbegin和cend都返回const_iterator.
注意: 凡是使用了迭代器的循环体, 都不要向迭代器所属的容器添加元素.
vector和string迭代器额外支持的运算符
iter + n, iter - n
iter += n, iter -= n
iter1 - iter2 // 类型为difference_type的带符号整数
>, >=, <, <=
数组
使用数据下标的时候, 通常将其定义为size_t类型. size_t类型是一种与机器相关的如符号类型, 它被设计的足够大以便能表示内存中任意对象的大小. 在cstddef头文件中定义了size_t类型.
指针也是迭代器
vector和string的迭代器支持的运算, 数组的指针全都支持, 为了获取尾后指针, C++11新标准引入两个名为begin和end的函数, 这两个函数与容器中的两个同名函数类似. 这两个函数定义在 iterator头文件中.
int ia[] = {1, 2, 3, 4};
int *beg = begin(ia); // 首元素的指针
int *end = end(ia); // 尾后元素指针, 不能执行解引用和递增操作
auto n = end(ia) - begin(ia); // 数组ia中的元素数量, n的类型为ptrdiff_t带符号类型, 该类型定义在头文件cstddef头文件中.
C风格字符串
C标准库String函数, 定义在ctring头文件中
strlen(p) // 返回p的长度, 不含'\n'
strcmp(p1, p2) // 比较p1, p2相等性, ==返回0, < 返回负值, > 返回正值
strcat(p1, p2) // 将p2附加到p1之后, 返回p1
strcpy(p1, p2) // 将p2拷贝给p1, 返回p1
混用string对象和C风格字符串
string s("Hello World");
const char *str = s.c_str(); // 如果后续操作改变了s, 可能导致str失效, 如果执行完c_str()函数后程序想一直使用返回的数组, 最好将该数组重新拷贝一份.
使用数组初始化vector对象
int iarr[] = {1, 2, 3, 4};
vector<int> ivec(begin(iarr), end(iarr));
vector<int> subVec(iarr + 1, iarr + 3); // 拷贝iarr[1], iarr[2]
多维数组
使用范围for循环处理多维数组, 除了最内层的循环外, 其他所有循环的控制变量都应该是引用类型.
int ia[3][4] = {{0, 1, 2, 3}, {4, 5, 6, 7}, {8, 9, 10, 11}};
// 使用范围for循环
for(auto &raw : ia) // 使用引用类型是为了防止数组名自动转为指针类型
for(auto col : raw) // 如果想要修改数组元素也需要使用引用类型, 单纯输出的话可以不使用引用类型
printf("%d ", col);
// 使用标准库函数
for(auto p = begin(ia); p != end(ia); ++p)
for(auto q = begin(*p); q != end(*p); ++q)
printf("%d ", *q);
// 使用指针
for(int (*p)[4] = ia; p != ia + 3; ++p)
for(int *q = *p; q != *p + 4; ++q)
printf("%d ", *q);
[C++ Primer] 第3章: 字符串, 向量和数组的更多相关文章
- <<C++ Primer>> 第三章 字符串, 向量和数组 术语表
术语表 第 3 章 字符串, 向量和数组 begin: 是 string 和 vector 的成员,返回指向第一个元素的迭代器.也是一个标准库函数,输入一个数字,返回指向该数字首元素的指针. 缓 ...
- C++ Primer 第3章 字符串、向量和数组
C++ Primer 第3章 字符串.向量和数组 C Primer 第3章 字符串向量和数组 1 命名空间的using声明 2 标准库类型string 3 标准库类型vector 4 迭代器介绍 5 ...
- PHP:第五章——字符串与数组及其他函数
<?php header("Content-Type:text/html;charset=utf-8"); //1.str_split——将字符串转换为数组. /*$str= ...
- 《汇编语言 基于x86处理器》第九章字符串与数组部分的代码
▶ 书中第九章的程序,主要讲了字符串相关的输入.输出,以及冒泡排序.二分搜索 ● 代码,Irvine32 中的字符串库函数代码范例 INCLUDE Irvine32.inc .data str1 BY ...
- C++ Primer 5th 第3章 字符串、向量和数组
*****代码在Debian g++ 5.40 / clang++ 3.8(C++11)下编写调试***** 本章主要是关于字符串.数组的内容,以及一些简单的容器知识. 1.using的声明 usin ...
- perl5 第四章 列表和数组变量
第四章 列表和数组变量 by flamephoenix 一.列表二.数组--列表的存贮 1.数组的存取 2.字符串中的方括号和变量替换 3.列表范围 4.数组的输出 5.列表/数组的长度 ...
- 《C#从现象到本质》读书笔记(五)第5章字符串第6章垃圾回收第7章异常与异常处理
<C#从现象到本质>读书笔记(五)第5章字符串 字符串是引用类型,但如果在某方法中,将字符串传入另一方法,在另一方法内部修改,执行完之后,字符串的只并不会改变,而引用类型无论是按值传递还是 ...
- C++ Primer 第2章 变量和基本类型
C++ Primer 第2章 变量和基本类型 C Primer 第2章 变量和基本类型 1 基本内置类型 算数类型 类型转换 字面值常量 2 变量 变量定义 3 复合类型 引用d左引用 指针d 4 c ...
- sizeof、strlen、字符串、数组,整到一块,你还清楚吗?
写在前面 sizeof.strlen.字符串.数组,提到这些概念,相信学过C语言的人都能耳熟能详,也能谈得头头是道,但是,在实际运用中,当这些内容交织在一起时,大家却不一定能搞地清清楚楚,本文的目的正 ...
随机推荐
- Jquery的深度拷贝和深度克隆
有人问,拷贝和克隆不都是“复制”的意思吗. 这位看官问的好,一般情况下是一样的,但在jquery中却有些不同.jqurey深度拷贝一般只js对象的复制,是$.extend()方法,jquery深度克隆 ...
- 20145326 《Java程序设计》实验一实验报告
北京电子科技学院(besti)实验报告 课程:Java程序设计 班级:1453 指导教师:娄嘉鹏 实验日期:2016.04.08 实验名称:Java开发环境的熟悉(Linux + Eclipse) 实 ...
- firefox_flash_install_on_kali
手动安装firefox的flash的步骤 1> 下载flash的tar.gz安装包 firefox http://get2.adobe.com/cn/flashplayer/otherversi ...
- Maven编译代码的时候跳过单元测试
Maven编译代码的时候跳过单元测试 <properties> <maven.test.skip>true</maven.test.skip> </prope ...
- UVa 1637 纸牌游戏(全概率公式)
https://vjudge.net/problem/UVA-1637 题意: 36张牌分成9堆,每堆4张牌.每次可以拿走某两堆顶部的牌,但需要点数相同.每种拿法的概率均为1/5.求成功概率. 思路: ...
- UVa 10791 最小公倍数的最小和(唯一分解定理)
https://vjudge.net/problem/UVA-10791 题意: 输入整数n,求至少两个正整数,使得它们的最小公倍数为n,且这些整数的和最小. 思路: 首先对n进行质因数分解,举个例子 ...
- Flex 布局的各属性取值解释
Flex布局是一种弹性布局.布局样式比较灵活,大多数情况下可以替代float,而且不会脱离文档里流. Flex中定义了两个轴线,一个主轴一个副轴,这个概念你可以想想屏幕坐标系(X轴向右,Y轴向下),F ...
- 将数据提取到CSV文件中保存
这个方法可以实现,登录获取的token放入CSV文件,供后续调用,这里没有用登录举例 FileWriter fstream = new FileWriter("E:\\apache-jmet ...
- 数据模板--DataTemplate
DataTemplate 的 "DataType" 通常就是 “ViewModel” ——视图模型(亦可不恰当称之为:数据模型) <DataTemplate DataType ...
- windows下的IO模型之事件选择(WSAEventSelect)模型
异步选择模型类似的是,它也允许应用程序在一个或多个套接字上,接收以事件为基础的网络事件通知.对于异步选择模型采用的网络事件来说,它们均可原封不动地移植到事件选择模型.事件选择模型和异步选择模型最主要的 ...