清华大学《C++语言程序设计基础》线上课程笔记05---vector对象,对象的复制与移动,string类
vector 对象
C++标准库中的一个类模板
- 封装任何类型的动态数组,自动创建和删除。
- 数组下标越界检查。
- 将动态数组封装成类的知识点中封装的ArrayOfPoints也提供了类似功能,但只适用于一种类型的数组。
vector<元素类型> 数组对象名(数组长度);
vector<int> arr(5) //建立大小为5的int数组
1.与一般数组不同,vector数组对象名不表示数组首地址;
2.可以用size函数获得vector数组的长度
unsigned n;
cin>>n;
vector<double> arr(n);
for (unsigned i = 0; i < n; i++)
cin >> arr[i]; //下标读取,因为Vector类中重载了下标运算符
cout << "Average = " << average(arr) << endl;
//计算数组arr中元素的平均值
double average(const vector<double> &arr) //常引用
{
double sum = 0;
for (unsigned i = 0; i<arr.size(); i++) //size函数的使用
sum += arr[i];
return sum / arr.size();
}
基于范围的 for 循环配合 auto 举例
#include <vector>
#include <iostream>
int main()
{
std::vector<int> v = {1,2,3};
for(auto i = v.begin(); i != v.end(); ++i) //.begin()和.end()取到迭代器的首尾地址
std::cout << *i << std::endl;
for(auto e : v) //适用于各种容器
std::cout << e << std::endl;
}
对象复制与移动
深层复制
- 当被复制的对象数据成员是指针类型时,不是复制该指针成员本身,而是将指针所指对象进行复制;
- 需要手写复制构造函数.
class ArrayOfPoints { //动态数组类
public:
ArrayOfPoints(int size) : size(size){ //构造函数
points = new Point[size]; //创建动态数组
}
~ArrayOfPoints() { //析构函数
delete[] points;
}
private:
Point *points; //指向动态数组首地址
int size; //数组大小
}
ArrayOfPoints::ArrayOfPoints(const ArrayOfPoints& v) {
size = v.size;
points = new Point[size]; //重新申请动态分配
for (int i = 0; i < size; i++)
points[i] = v.points[i]; //挨个复制
}
移动构造(C++11)
将即将消亡的源对象(左值)资源的控制权全部交给目标对象,无需重新申请内存分配
class_name ( class_name && )
注:&&是右值引用,函数返回的临时变量是右值
class IntNum {
public:
IntNum(int x = 0) : xptr(new int(x)){ //构造函数
cout << "Calling constructor..." << endl;}
IntNum(const IntNum & n) : xptr(new int(*n.xptr)){//复制构造函数
cout << "Calling copy constructor..." << endl;}
IntNum(IntNum && n): xptr( n.xptr){ //移动构造函数
n.xptr = nullptr;
cout << "Calling move constructor..." << endl;}
~IntNum(){ //析构函数
delete xptr;
cout << "Destructing..." << endl;}
private:
int *xptr;
};
//返回值为IntNum类对象
IntNum getNum() {
IntNum a;
return a;}
int main()
{ cout << getNum().getInt() << endl; return 0;
}
字符串
用字符数组存储字符串(C 风格字符串)
char str[8] = { 'p', 'r', 'o', 'g', 'r', 'a', 'm', '\0' };
char str[8] = "program";
char str[] = "program";
string 类
- 使用字符串类string表示字符串;
- string实际上是对字符数组操作的封装.
string s1;
string s2 = “abc”;
string s3 = s2;
常用操作
s + t 将串s和t连接成一个新串
s = t 用t更新s
s == t 判断s与t是否相等
s != t 判断s与t是否不等
s < t 判断s是否小于t(按字典顺序比较)
s <= t 判断s是否小于或等于t (按字典顺序比较)
s > t 判断s是否大于t (按字典顺序比较)
s >= t 判断s是否大于或等于t (按字典顺序比较)
s[i] 访问串中下标为i的字符
例:
string s1 = "abc", s2 = "def";
string s3 = s1 + s2; //结果是"abcdef"
bool s4 = (s1 < s2); //结果是true
char s5 = s2[1]; //结果是'e''
输入整行字符串
" cin>>..."读取到空格时会停止录入字符串
此时,可以
#include<string>
使用getline()函数
可以用第三个参数设置字符串结束的分隔符
#include <iostream>
#include <string> //需要包含该头文件
using namespace std;
int main() {
for (int i = 0; i < 2; i++)
{ string city, state;
getline(cin, city, ',');//第三个参数可以设置字符串结束的分隔符
getline(cin, state); //默认是换行符结束
cout << "City:" << city << “ State:" << state << endl;
}
return 0;
}
清华大学《C++语言程序设计基础》线上课程笔记05---vector对象,对象的复制与移动,string类的更多相关文章
- 清华大学《C++语言程序设计基础》线上课程笔记02---类与对象
类与对象 public是类的对外访问接口: 类内初始值 在定义类时对数据成员写初始值,在创建对象的时候,会使用类内初始值初始化数据成员: class Clock { public: void show ...
- 清华大学《C++语言程序设计基础》线上课程笔记04---指针
指针 static int i; static int* ptr = &i; 此处的*表示ptr是指针类型(地址类型),用来存放目标数据的地址 其本身也有地址,所以又指向指针的指针; *前面的 ...
- 清华大学《C++语言程序设计进阶》线上课程笔记06---继承、派生、多态性
类的继承 保持已有类的特性而构造新类的过程称为继承; 实现设计与代码的重用. 在已有类的基础上新增自己的特性而产生新类的过程称为派生 当新的问题出现,原有程序无法解决(或不能完全解决)时,需要对原有程 ...
- 清华大学《C++语言程序设计基础》线上课程笔记03---数据的共享和保护&数组
数据的共享和保护 对象的生存期 static类型的局部变量,生存期在整个程序,局部可见. void example() { static a=1; int b=2 } 当调用完example函数后,b ...
- 清华大学《C++语言程序设计基础》线上课程笔记01---基础概念与一些注意事项
使用除法的注意事项 double b = 4.0 * 1/239.0; 因为整数相除结果取整,如果参数写1/239,结果就都是0 浮点数注意事项 浮点数是近似存储,所以不能直接比较两个浮点数的大小, ...
- 软件工程线上课程(C语言实践篇)学习心得总结
林牧 + 原创作品转载请注明出处 + <软件工程(C编码实践篇)>MOOC课程http://mooc.study.163.com/course/USTC-1000002006 软件工程的理 ...
- C语言程序设计基础-第1周作业-初步
1.安装带有计算机术语的翻译软件 2.在自己电脑上安装C编译器,windows系统建议安装dev-c++,其他系统自行查找. 3.加入课程小组,有任何疑问可以在小组中提问:https://group. ...
- 欢迎参加MVP主讲的Windows 10开发线上课程
博客地址:http://blog.csdn.net/FoxDave Windows 10 Developer Readiness - Powered by MVPs - 由微软最有价值专家(MVP)主 ...
- C语言程序设计基础知识点概括
C语言程序设计基础知识点概括 C语言程序设计基础知识点1.函数是C语言的基本构成单位.main函数是C语言程序的唯一入口.2.C语言程序开发过程. 编译过程:将以.c或.cpp结尾的源程序文件经过编译 ...
随机推荐
- kivy.org - Open source Python library for rapid development of applications
kivy.org - Open source Python library for rapid development of applicationsthat make use of innovati ...
- Ubuntu查看版本信息
关于查看Ubuntu的版本信息,我们会用到两个命令uname和cat. uname命令 这个命令用于显示系统信息.其参数为: -a 显示所有系统信息.其中包括机器名.操作系统名.内核名称等. 以下为执 ...
- mem系函数总结
memset(); 原型: void *memset(void *s, int ch, size_t n); 含义: 将s所指向的某一块内存中的每个字节的内容全部设置为ch指定的ASCII值,块的 ...
- Linux 命令行 发送邮件
1.mail -s hi xx@yy.com 给xx@yy.com发一封主题为hi的信(没有正文) 编辑完内容后Ctrl-D结束. 2.echo "This is a test mail!& ...
- [零基础学JAVA]Java SE基础部分-03. 运算符和表达式
转自:http://redking.blog.51cto.com/27212/116751 1.课程名称:运算符.表达式 讲解了JAVA中各种运算符的使用,包括与.或.非.大于.小于等. 2.知识点 ...
- (转)从信息隐藏的一个需求看C++接口与实现的分离
原文地址https://blog.csdn.net/tonywearme/article/details/6926649 让我们从stackoverflow上一个同学的问题来开始.问题的原型是这样的( ...
- ZOJ-3286 Very Simple Counting---因子数打表
题目链接: https://cn.vjudge.net/problem/ZOJ-3286 题目大意: f(n)为n的因子个数 求出有多少个f(i)使得f(i) == f(n) && i ...
- [零基础学pythyon]安装python编程环境
不论什么高级语言都是须要一个自己的编程环境的,这就好比写字一样,须要有纸和笔,在计算机上写东西.也须要有文字处理软件,比方各种名称的OFFICE.笔和纸以及office软件,就是写东西的硬件或软件.总 ...
- 汇编试验十四:访问CMOS RAM
CMOS RAM 芯片的特征: 包含一个时钟和一个有128个存储单元的RAM存储器. 该芯片靠电池供电.所以,关机后其内部的时钟仍可正常工作,RAM中的信息不丢失. 128个字节的RAM中,内部时钟占 ...
- 2019.1.10 Mac安装Nginx服务器
1.安装Homebrew ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/in ...