文章目录
第六天
现在是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]
今天先结束了,本来想着大概一个半小时写完,看来还是不大够用,下次争取提高效率