C++ on the road (2)

vector

是 C++ 标准库中定义的一个类模板,用来模拟数组的相关行为
● 与内建数组相比,更侧重于易用性
– 可复制、可在运行期动态改变元素个数
● 构造与初始化
– 聚合初始化
– 其它的初始化方式
● 其它方法

– 获取元素个数、判断是否为空
– 插入、删除元素
– vector 的比较

#include <iostream>
#include <vector>

int main()
{
   std::vector<int> x;//缺省初始化,vector中包含0个元素
   std::vector<int> x(3);//缺省初始化,x中包含3个元素
   std::vector<int> y = {123};//聚合初始化,与数组一直
}
//以下两条语句等价,注意区分大括号和小括号
std::vector<int> x1(3,1);
std::vector<int> x2{1,1,1};
std::cout << x1.size() << std::endl;//获取x1的元素个数,为3
std::cout << x1.empty() << std::endl;//如果x1中无元素,为true,则返回1;有元素,为false,返回0

插入、删除元素:

 std::vector<int> x1;
 x1.push_back(2);//此时x1里包含一个元素,为2
 x1.pop_back(2);//此时x1里没有元素

比较:

std::vector<int> x1 = {1,2,3};
std::vector<int> x2 = {1,3,2};
//字典排序,可轻易的进行vector比较,相反数组就比较复杂
std::cout << (x1 == x2) << std::endl;
std::cout << (x1 <  x2) << std::endl;

● vector 中元素的索引与遍历:
– [] V.S. at
– ©begin / ©end 函数 V.S. ©begin / ©end 方法
● 迭代器
– 模拟指针的行为
– 包含多种类别,每种类别支持的操作不同
– vector 对应随机访问迭代器
● 解引用与下标访问
● 移动
● 两个迭代器相减求距离
● 两个迭代器比较

元素索引

std::vector<int> x1 = {1,2,3};
x1[2];
x1.at(2);//返回3

//以下两种等价
auto b = std::begin(x1);//begin、end函数,b的类型是迭代器
auto b = x1.begin();//begin、end方法
auto e = x1.end();

遍历方式:
在这里插入图片描述
在这里插入图片描述
● vector 相关的其它内容
– 添加元素可能使迭代器失效
– 多维 vector
– 从 . 到 -> 操作符
– vector 内部定义的类型
●size_type
●iterator / const_iterator

多维vector:

int main()
{
   int a[3][4];
   std::vector<std::vector<int>> x;

vector指针:

std::vector<int> x;
std::vector<int>* ptr = &x;
std::cout << (*ptr).size() << std::endl;//指针调用对象的方法
std::cout << ptr->size() << std::endl;//等同于上句,->前面必须是指针,指针指向某一个类的操作符

string

● 是 C++ 标准库中定义的一个类模板特化别名,用于内建字符串的代替品,是一种数据结构
● 与内建字符串相比,更侧重于易用性
– 可复制、可在运行期动态改变字符个数
● 构造与初始化
● 其它方法
– 尺寸相关方法( size / empty )
– 比较
– 赋值
– 拼接
– 索引
– 转换为 C 字符串

#include <iostream>
#include <string>
int main()
{
   std::string x = "Hello world";//初始化std:string x(3,'a')
   std::string y = x;//std:string y(x);
   y = y + "!";
   y = y + "hello"; //或者y = "hello" + x; 
   //y = "hello" + "world" + x; 这种错误;y = std::string("hello") + "world" + "!";这种可以;y = "world" + std::string("hello") + "!";这种也可以
   y1 = "New String";//赋值
   std::cout << y[2] <<std::endl;//索引

转换为C字符串
在这里插入图片描述

表达式

表达式由一到多个操作数组成,可以求值并 ( 通常会 ) 返回求值结果
– 最基本的表达式:变量、字面值
– 通常来说,表达式会包含操作符(运算符)
– 操作符的特性
● 接收几个操作数:一元、二元、三元
● 操作数的类型- 类型转换
● 操作数是左值还是右值
● 结果的类型
● 结果是左值还是右值
● 优先级与结合性 (cpp-reference) ,可以通过小括号来改变运算顺序
● 操作符的重载 不改变接收操作数的个数、优先级与结合性 ——
– 操作数求值顺序的不确定性

C++操作符优先级参考:https://en.cppreference.com/w/cpp/language/operator_precedence

表达式基础 左值与右值
● 传统的左值与右值划分
– 来源于 C 语言:左值可能放在等号左边;右值只能放在等号右边
– 在 C++ 中,左值也不一定能放在等号左边;右值也可能放在等号左边
● 所有的划分都是针对表达式的,不是针对对象或数值
– glvalue :标识一个对象、位或函数
– prvalue :用于初始化对象或作为操作数
– xvalue :表示其资源可以被重新使用
在这里插入图片描述
具体参考https://zh.cppreference.com/w/cpp/language/value_category
在这里插入图片描述
● 左值与右值的转换
– 左值转换为右值( lvalue to rvalue conversion )
– 临时具体化( Temporary Materialization )
● 再论 decltype
– prvalue → type
– lvalue → type&
– xvalue → type&&

**表达式基础-类型转换 **

● 一些操作符要求其操作数具有特定的类型,或者具有相同的类型,此时可能产生类型转换
● 隐式类型转换
– 自动发生
– 实际上是一个(有限长度的)转型序列
– https://en.cppreference.com/w/cpp/language/implicit_conversion
● 显式类型转换
– 显式引入的转换
– static_cast
– const_cast
– dynamic_cast
– reinterpret_cast
– C 形式的类型转

显式类型转换
在这里插入图片描述
static_cast 转换详细参考https://zh.cppreference.com/w/cpp/language/static_cast

更多显式类型转换方式:https://zh.cppreference.com/w/cpp/language/explicit_cast

算数操作符

● 共分为三个优先级
– + , - (一元)(高)//+3,+x等
– *, / , %
– + , - (二元)(低)// 5+3, x+y等
● 均为左结合的
● 通常来说,操作数与结果均为算数类型的右值;但加减法与一元 + 可接收指针
● 一元 + 操作符会产生 integral promotion
● 整数相除会产生整数,向 0 取整
● 求余只能接收整数类型操作数,结果符号与第一个操作数相同
● 满足 (m / n) * n + m % n == m

逻辑与关系操作符
● 关系操作符接收算术或指针类型操作数;逻辑操作符接收可转换为 bool 值的操作数
● 操作数与结果均为右值(结果类型为 bool )
● 除逻辑非外,其它操作符都是左结合的
● 逻辑与、逻辑或具有短路特性
● 逻辑与的优先级高于逻辑或
● 通常来说,不能将多个关系操作符串连
● 不要写出 val == true 这样的代码
● Spaceship operator: <=>
– strong_ordering
– weak_ordering
– partial_ordering

详情请见C++ Operator Precedence

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值