2021-10-05

文章目录

第六天

现在是18:33,今天一早上没课,去了图书馆,蹲了大概3个半小时,看了会c++的书,看了会专业课的书,有效学习时间估计有2个多小时吧,觉得好像也并没学到什么东西,下午是两个半小时的英语课,真的折磨,连着俩半小时,都不下课的。
出现了一点小插曲,差点今年校荣誉称号又没了,还好是体质总分达到3就是良好了,这个对我来说还是比较重要的。开始今日学习笔记:

1.相关vector操作

改变vector对象的值

vector<int> v{1,2,3,4,5,6,7,8};
for (auto &i : v)
	i *= i;
for (auto i : v)
	cout << i << "" << endl;

一种通过引用改变值的方法

vector.empty()
vector.size()

作用string的成员函数一样,上面返回bool类型,下面返回size_type类型

这里简单的说一下vector对象的比较方法
1.如果vct1和vct2的容量不同,容量大的值大
2.如果vct1和vct2的容量相同,则从头开始比较,直到第一对相异的字符,通过他们的大小关系来确定

一个例子

一个vector对象的例子,统计每个分数段内学生的数量

vector<int> stds(11,0);
int grds;
while(cin >> grds){
	if (grds <100){
		++stds[grds/10]; //简洁性
	}
}
for (auto i : stds)
	cout << i << endl;

上述代码,之前是定义了一个新的vct1向量,是0值,如果是空的的话,后面加入变量就得用vct1.push_back()了
不是很清楚为什么书上有些地方写的很复杂,比如说对于一个vector对象vct1,我可以int x = 1去声明定义一个变量,他非得

decltype(vct1.size()) x = 1;

而且这种例子很多

2.迭代器

先增强一下定义,迭代器是一种类型,类似于指针,也是指向一个变量,但是迭代器中的运算,不像指针一样,如果是指针运算,那么得到的可能是两个他们所指向的值的运算,迭代器的运算就是迭代器的运算

begin和end成员

auto好评

auto b = v.begin(), e = v.end();

1.begin负责指向第一个元素,end负责指向最后一个元素的下一个,所以end的指向是没有值的,但是如果是v.end() - v.begin()所得的就是元素个数。
2.如果容器是空的,begin和end返回的是同一个迭代器,都是尾后迭代器,二至是相等的,如果二者指向的元素相同,那么他们也是相等的。

一些迭代器运算符

项目 Value
*iter 返回迭代器iter所指元素的引用
iter->mem 解引用iter并获取该元素名为mem的成员,等价于(*iter).mem
++iter 指向容器的下一个元素
—iter 指向容器的上一个元素
iter1 == iter2 判断两个迭代器是否相等
iter1 != iter2 判断两个迭代器不相等,判断,两种情况,如上

来丶例子
将第一个字符改为大写形式

string s("some thing");
if (s.begin() != s.end())
	auto it = s.begin();
	*it = toupper(*it);

迭代器,我觉得,应该可以理解为一种特殊的指针类型吧
将第一个单词改为大写形式

for(auto it = s.begin(); it != s.end() && !isspace(*it); ++it)
	*it = toupper(*it);

迭代器类型

这个简单知道一下就行

vector<int>::iterator it1;//it1能读写vector<int>中的元素
string::iterator it2; //it2能读写string对象中的字符
vector<int>const_iterator it3; //it3只读,不写
string::const_iterator it4; //it4智能读字符,不能写字符

简单说一下c++11的cend和cbegin
二者作用同end和begin但是他们的返回类型都是const_iterator

结合解和引用的操作

(*it).empty,上面简单的说了一下,就是it指向的对象的成员函数,可以简写为it->empty
举个例子

for(auto it = text.cbegin(); it != text.cend() && !it->empty(); ++it){
	cout << *it << endl;
}

迭代器进行二分搜索

vector<int> text{1,2,3,4,5,6,7,8,9,10};
int sought = 7;
auto beg = text.begin();
auto end = text.end();
auto mid = text.begin() + (end - beg)/2;
while (mid != end && *mid != sought){
	if(sought > *mid){
		beg = mid;
	}
	else{
		end = mid;
	}
	mid = beg + (end - beg)/2;
}

这个我也不是很清楚怎么让他显示成功,他如果跳出循环出去执行cout就差不多了吧

3.数组

数组操作基本同c,移植过来的
一样的,必须要先定义数组的大小,维度必须是已知的,或者是一个常量表达式

数组声明

constexpr unsigned sz = 42; //常量表达式
int arr[10]; //含有10个整型的数组
int *parr[sz]; //常量表达式数组
string strs[get_size()]; 	//当get_size()是constexpr时候正确

初始化数组

const unsigned sz = 3; 
int ial[sz] = {0, 1, 2};//含有3个元素的数组,元素值为0,1,2
int a2[] = {0, 1, 2};//维度是3的数组
int a3[5] = {0, 1, 2};//维度为5,值为0,1,2,0,0
string a4[3] = {"hi", "bye"};//等价于a4[] = {"hi", "bye", ""}
int a5[2] = {0, 1, 2};//初始值过多

注意:不允许一个数组给另一个数组赋值,不允许用一个数组初始化另一个数组

复杂的数组声明

int *ptrs[10]; //ptrs是含有10个整型指针的数组 
int (*Parray)[10] = &arr; //Parry指向一个含有10个证书的数组 
int (&arrRef)[10] = arr;  //arrRef引用一个含有10个整数的数组 

访问数组元素

对于上面的成绩统计,一种代换方法,可以用数组来做

unsigned scores[11] = {};

遍历依旧是for

for (auto i : scores)
	cout << i << " " << endl;

下标访问不说了,和向量一样

指针和数组

string nums[] = {"kk", "one", "two"};
string *p = &nums[0]; //p会自动指向nums的第一个元素 
string *p2 = nums; //等价于p2 = &nums[0]

今天先结束了,本来想着大概一个半小时写完,看来还是不大够用,下次争取提高效率

上一篇:Auto CAD 2021安装教程【64位】


下一篇:spring 通过注解设置实体类自增