C++ Primer 第3章 字符串、向量和数组


3.1 命名空间的using声明

using namespace::name;

头文件不应包含using声明


3.2 标准库类型string

使用等号(=)初始化一个变量,实际上执行的是拷贝初始化,编译器把等号右侧的初始值拷贝到新创建的对象中去。如果不使用等号,则执行的是直接初始化

常用操作:

- getline(is,s)从is中读取一行赋给s,返回is

- s.empty()s为空返回true,否则返回false

- s.size()返回s中字符的个数

其中getline函数从给定的输入流中读取内容,直到遇到换行符为止(注意换行符也被读进来了),然后把所读的内容存入到string对象中(注意不存换行符)。如果输入的一开始就是换行符,那么所得的结果是个空string

触发getline函数返回的那个换行符实际上被丢弃掉了,得到的string对象中并不包含该换行符。

size()函数返回的类型是string::size_type类型,是无符号整型数,这体现了标准库类型与机器无关的特性。在C++11新标准中,允许编译器使用auto或者decltype来推断变量的类型。

由于是无符号整型数,所以不能和负数比,因为负数会自动转换成一个比较大的无符号值。

字符串字面值与string是不同的类型,字符串无法用加号相连。

cctype头文件中的函数:

isalnum(c)/isalpha(c)/iscntrl(c)/isdigit(c)/isgraph(c)/islower(c)

ispunct(c)/isspace(c)/isupper(c)/isxdigit(c)/tolower(c)/toupper(c)

在名为cname的头文件中定义的名字属于命名空间std,而定义在.h的头文件中则不然。

处理每个字符,使用基于范围的for语句

for (auto c : str)
cout << c << endl;

使用范围for语句改变字符串中的字符(使用引用)

for (auto &c : s)
c = toupper(c);
cout << s << endl;

string的下标运算符[]接受的是string::size_type的值,其他值会自动转换为无符号类型。


3.3 标准库类型vector

vector的size返回的类型是vector<type>::size_type

不能通过下标添加元素,正确的方法是使用push_back

超出下标范围会产生缓冲区溢出(buffer overflow)

确保下标合法的一种有效手段就是尽可能使用范围for语句。


3.4 迭代器介绍

vecotr<int>::iterator it;

string::iterator it2;

vector<int>::const_iterator it3; //只读

string::const_iterator it4; //只读

begin负责返回指向第一个元素的迭代器

end返回“尾元素的下一位置”的迭代器,是本不存在的“尾后”元素。

如果容器为空,则begin和end返回的是同一个迭代器,都是尾后迭代器。

  • *iter返回迭代器iter所指元素的引用
  • iter->mem解引用iter并获取该元素的名为mem的成员,等价于(*iter).mem
for (auto it = text.cbegin();
it != text.cend() && !it->empty(); ++it)
cout << *it << endl;

关键概念:泛型编程

C++程序员习惯性的在循环中使用!=,因为所有标准库容器都定义了==和!=,但是它们大多数都没有定义<运算符。因此,只要养成使用迭代器和!=的习惯,就不用太在意用的到底是哪种容器类型。

常量begin和end用v.cbegin()v.cend()获得

谨记,但凡是使用了迭代器的循环体,都不要向迭代器所属的容器添加元素,这样会使迭代器失效。

两个迭代器相减的结果是它们之间的距离

距离类型是difference_type,是带符号整数型

取中间:auto mid = vi.begin() + vi.size() / 2;

使用迭代器完成二分查找:

auto beg = text.begin(), end = text.end();
auto mid = text.begin() + (end - beg)/2;
while (mid != eend && *mid != sought){
if (sought < *mid)
end = mid;
else
beg = mid + 1;
mid = beg + (end - beg)/2;
}

3.5 数组

定义

  • 数组可使用定义为constexpr的函数来指定大小。
  • 数组无法使用auto关键字
  • 数组的元素应为对象
  • 数组不允许拷贝给其他数组作为初始值,也不能为其他数组赋值

指向数组的指针和引用

int (*Parray) [10] = &arr;
int (&arrRef) [10] = arr;

访问数组元素

在使用数组下标的时候,通常将其定义位size_t类型,这是一种机器相关的无符号类型,它被设计的足够大以便能表示内存中任意对象的大小。在cstddef头文件中定义了size_t类型,这个文件是stddef.h的C++版本。

将数组初始化为0:unsigned scores[11] = {};

指针和数组

在很多用到数组名字的地方,编译器都会自动的将其转换位一个指向数组首元素的指针;意味着用auto时,初始化为数组时,其实是指向数组首元素的指针。二decltype返回的类型是数组,数组大小和原数组一致。

指针也是迭代器

我们可使用不存在的元素地址作为尾后指针

int *e = &arr[10];
for (int *b = arr; b != e; ++b)
cout << *b << endl;

C++11中为了避免出错引入了begin和end标准库函数,用数组名作为它们的参数。这两个函数定义在iterator头文件中

// Find first negative number.
int *pbeg = begin(arr), *pend = end(arr);
while (pbeg != pend && *pbeg >=0)
++pbeg;

两个指针相减的结果类型是一种名为ptrdiff_t的标准库类型,和size_t一样,也是一种定义在cstddef头文件中的机器相关的类型。因为差值可能位负值,所以ptrdiff_t是一种带符号类型。对于空指针同样适用

与旧代码的接口

string对象有c_str()方法为字符数组赋值:

const char *str = s.c_str();

使用数组初始化vector对象:

vector<int> ivec(begin(int_arr), end(int_arr));


3.6 多维数组

对于二维数组来说,常把第一个维度称作行,第二个维度称作列。

用花括号初始化每行元素:

int ia[3][4] = {{ 0 }, { 4 }, { 8 }};

使用范围for语句处理多维数组

size_t cnt = 0;
for (auto &row : ia)
for (auto &col :row){
col = cnt;
++cnt ;
}

使用标准库函数begin和end也能实现:

for (auto p = begin(ia); p != end(ia); ++p){
for (auto q = begin(*p); q != end(*p); ++q)
cout << *q << ' ';
cout << endl;
}

将4个整数组成的数组命名位int_array:

using int_array = int[4];
typedef int int_array[4];

C++ Primer 第3章 字符串、向量和数组的更多相关文章

  1. <<C++ Primer>> 第三章 字符串, 向量和数组 术语表

    术语表 第 3 章 字符串, 向量和数组 begin: 是 string 和 vector 的成员,返回指向第一个元素的迭代器.也是一个标准库函数,输入一个数字,返回指向该数字首元素的指针.    缓 ...

  2. [C++ Primer] 第3章: 字符串, 向量和数组

    标准库类型string string初始化 string s2(s1); string s2 = s1; string s3("value"); string s3 = " ...

  3. PHP:第五章——字符串与数组及其他函数

    <?php header("Content-Type:text/html;charset=utf-8"); //1.str_split——将字符串转换为数组. /*$str= ...

  4. 《汇编语言 基于x86处理器》第九章字符串与数组部分的代码

    ▶ 书中第九章的程序,主要讲了字符串相关的输入.输出,以及冒泡排序.二分搜索 ● 代码,Irvine32 中的字符串库函数代码范例 INCLUDE Irvine32.inc .data str1 BY ...

  5. C++ Primer 5th 第3章 字符串、向量和数组

    *****代码在Debian g++ 5.40 / clang++ 3.8(C++11)下编写调试***** 本章主要是关于字符串.数组的内容,以及一些简单的容器知识. 1.using的声明 usin ...

  6. perl5 第四章 列表和数组变量

    第四章 列表和数组变量 by flamephoenix 一.列表二.数组--列表的存贮  1.数组的存取  2.字符串中的方括号和变量替换   3.列表范围  4.数组的输出  5.列表/数组的长度  ...

  7. 《C#从现象到本质》读书笔记(五)第5章字符串第6章垃圾回收第7章异常与异常处理

    <C#从现象到本质>读书笔记(五)第5章字符串 字符串是引用类型,但如果在某方法中,将字符串传入另一方法,在另一方法内部修改,执行完之后,字符串的只并不会改变,而引用类型无论是按值传递还是 ...

  8. C++ Primer 第2章 变量和基本类型

    C++ Primer 第2章 变量和基本类型 C Primer 第2章 变量和基本类型 1 基本内置类型 算数类型 类型转换 字面值常量 2 变量 变量定义 3 复合类型 引用d左引用 指针d 4 c ...

  9. sizeof、strlen、字符串、数组,整到一块,你还清楚吗?

    写在前面 sizeof.strlen.字符串.数组,提到这些概念,相信学过C语言的人都能耳熟能详,也能谈得头头是道,但是,在实际运用中,当这些内容交织在一起时,大家却不一定能搞地清清楚楚,本文的目的正 ...

随机推荐

  1. 1012: A MST Problem

    1012: A MST Problem 时间限制: 1 Sec  内存限制: 32 MB提交: 63  解决: 33[提交][状态][讨论版][命题人:外部导入] 题目描述 It is just a ...

  2. 2018.7.20 编程题: 写一个Singleton出来。

    编程题: 写一个Singleton出来. Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在. 一般Singleton模式通常有几种种形式: 第一种形式: 定义 ...

  3. 2017.10.3 JDBC访问数据库的建立过程

    1·JDBC访问数据库,其访问流程: (1)注册驱动 (2)建立连接(Connection) (3)创建数据库操作对象用于执行SQL语句 (4)执行语句 (5)处理执行结果 (6)释放资源 2·注册驱 ...

  4. [ difflib] simple1.py

    #!/usr/bin/env python # _*_ coding:utf-8 _*_ import difflib text1 = """text1: # 定义字符串 ...

  5. grep的使用

    http://www.eguidedog.net/linux-tutorial/05-grep.php grep apple fruitlist.txt:在fruitlist.txt中查找apple字 ...

  6. P1069 细胞分裂

    P1069 细胞分裂 考虑质因数分解 先将m1,质因数分解后再根据数学定理将所有质数的质数全乘m2 然后将输入的数据相同处理,再判断 顺便说一下判断规矩 1肯定不行 如果分解后有没有m1质因数分解中的 ...

  7. Laravel 5 : Call to undefined function Illuminate\Foundation\Bootstrap\mb_internal_encoding()

    自己组装的apache,php,mysql phpinfo显示 OpenSSL support     disabled (install ext/openssl) 判断为权限问题,所以修改如下. 1 ...

  8. 第16章 STM32中断应用概览—零死角玩转STM32-F429系列

    第16章     STM32中断应用概览 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/fi ...

  9. 其它内置函数(zip等)

      python内置函数 截止到python版本3.6.2,python一共为我们提供了68个内置函数.它们就是python提供给你直接可以拿来使用的所有函数     Built-in Functio ...

  10. 总结ing

    1,iOS的GCD中如何关闭或者杀死一个还没执行完的后台线程? 举例来说,我通过导航进入到了一个视图,这个视图加载的时候会新建一个线程在后台运行,假设这个线程需要从网络中读取许多数据,需要一定的时间, ...