Cpp Primer 学习笔记 第3章

编号

说明

1

using 声明

 

头文件中一般不应该使用using声明

 

2

标准库类型string

 

#include<string>

using std::string;

 

初始化方式:

string s1;

string s2(s1);

string s2 = s1;

string s3("value");

string s3 = "value";

string s4(n, 'c');

 

直接初始化

拷贝初始化 =

 

string对象操作:

os << s

is >> s

getline(is, s)

s.empty()

s.size()

s1 + s2

s1 = s2

s1 == s2

s1 != s2

<, <=, >, >=

 

string::size_type类型

auto len = s.size();

在索引中也可以使用

 

cctype头文件函数:

isalnum(c)

isalpha(c)

iscntrl(c)

isdigit(c)

isgraph(c)

islower(c)

isprint(c)

ispunct(c)

isspace(c)

isupper(c)

isxdigit(c)

tolower(c)

toupper(c)

 

for (declaration : expression)

statement

 

for (auto c : s)

 

for (auto &c : s)

 

string可以使用下标运算符

3

标准库类型 vector

 

容器container

 

#include<vector>

using std::vector;

 

C++有类模板和函数模板,vector属于类模板

 

编译器根据模板创建类或者函数的过程称为实例化instantiation

 

初始化:

vector<T> v1

vector<T> v2(v1)

vector<T> v2 = v1

vector<T> v3(n, val)

vector<T> v4(n)

vector<T> v5{a, b, c, …}

vector<T> v5 = {a, b, c, …}

 

默认有值初始化,根据类型决定

 

添加元素

vec.push_back()

 

范围for循环 (不是传统for循环) 不能向vector对象添加元素

 

 

4

迭代器

 

end()指向尾元素的下一位置

 

运算符:

*iter

iter->mem

++iter

--iter

iter1 == iter2

iter1 != iter2

 

迭代器类型:

iterator

const_iterator

 

vector<int> v;

const vector<int> cv;

auto it1 = v.begin();

auto it2 = cv.begin();

 

箭头运算符 ->

将解引用和成员访问结合

it->mem 等价于 (*it).mem

 

push_back会使vector对象的迭代器失效

 

运算:

iter + n

iter - n

iter += n

iter -= n

iter1 - iter2

>, <, <=, >=

 

距离类型名:

difference_type

 

auto mid = vec.begin() + vec.size() / 2;

二分查找

 

5

数组

 

存放类型相同的元素, vector也是

使用数组时需要确定元素数量,vector可以不确定情况下使用

 

定义数组时必须指定类型,而不能用auto

 

字符数组需要留出空间存放结束符

 

复杂的数组定义:

    int *ptrs[10]; // ptrs是含有10个整型指针的数组

    // int &refs[10] = /* ? */; // error, 不存在引用的数组

    int (*Parray)[10] = &arr; // Parray 指向一个含有10个整数的数组

    int (&arrRef)[10] = arr; // arrRef引用一个含有10个整型的数组

类型修饰符从右向左依次绑定

 

数组元素访问:

索引,数组下标size_t类型,size_t定义于cstddef头文件中(stddef.h的C++对应版本)

 

某些情况下,数组的操作实际上是指针的操作

 

指针也是迭代器

++p

可以用数组索引一个不存在的元素(尾指针)进行初始化

int *e = &arr[10]; // 指向arr尾元素的下一位置的指针

也可以使用begin(), end()  定义位于iterator头文件

int *beg = begin(ia);

int *last = end(ia);

 

指针运算结果

auto n = end(arr) - begin(arr); // type: ptrdiff_t

 

两个指针指向同一个数组时,可以利用关系运算符比较,否则,不能

 

 

6

c风格字符串

尽量少使用

c标准库 string函数 cstring头文件

strlen(p)

strcmp(p1, p2)   // == 0  > 正数 < 负数

strcat(p1, p2)

strcpy(p1, p2)

 

此类函数使用时,需保证数组以空字符结尾

 

可以使用以空字符结尾的字符数组来初始化string对象,或者为string对象赋值,反之不行

但是可以使用string的c_str成员函数对字符数组赋值

const char *str = s.c_str(); // char * 不可以,必须是const char *

 

7

数组初始化vector

8

多维数组

 

    int ia[3][4] = {{1, 2, 3, 4},

                    {5, 6, 7, 8},

                    {9, 10, 11, 12}}; // 里面的花括号非必须

    int ib[3][4] = {{0}, {1}, {2}}; // 只初始化每行第一个元素

    int ic[3][4] = {0, 1, 2, 3}; // 只初始化第一行

 

    int (&row)[4] = ia[1]; // row绑定至ia的第二行

 

   // 循环遍历

    for (auto &row : ia)

    {

        for (auto &col : row)

        {

            cout << col << " ";

        }

    }

 

    int (*pa)[4] = ia;

    cout << *pa[1] << endl; // ia[1]第一个元素

    cout << (*pa)[1] << endl; // ia[0]第2个元素

    //cout << (*pa)[1][1] <<" " << (*pa)[2][1] << endl; // error

 

    // 多维数组遍历新用法

    for (auto pb = ia; pb != ia + 3; pb++)

    {

        for (auto q = *pb; q != *pb + 4; q++) {

            cout << *q << ' ';

        }

 

        cout << endl;

    }

    // 方法类似上面

    for (auto pc = begin(ia); pc != end(ia); ++pc)

    {

        for (auto q = begin(*pc); q != end(*pc); ++q)

        {

            cout << *q << " ";

        }

        cout << endl;

    }

 

9

类型别名简化指针

using int_array int[4];

typedef int int_array[4];

 

10

define bias origin

typedef origin bias;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值