小人物学个大习(121-130)
C++ primer
关键概念:范型编程,在for循环中使用!=而非<,更多的使用迭代器。
迭代器类型
就像不知道string和vector的size type成员(参见3.2.2节,第79页)到底是什么类型一样,一般来说我们也不知道(其实是无须知道)迭代器的精确类型。而实际上, 那些拥有迭代器的标准库类型使用iterator和const iterator来表示迭代器的类型:
vector::iterator it;//it能读写vector的元素
string::iterator it2; //it2能读写string对象中的字符
vector::const iterator it3;//it3只能读元素,不能写元素
string::const iterator it4; //it4只能读字符,不能写字符
const iterator和常量指针(参见242节,第56页)差不多,能读取但不能修改它所指的元素值。相反,iterator的对象可读可写。如果vector对象或string对象是一个常量,只能使用const iterator;如果vector对象或string对象不是常量, 那么既能使用iterator也能使用const iterator。
术语:迭代器和迭代器类型
迭代器这个名词有三种不同的含义:可能是迭代器概念本身,也可能是指容器定义的迭代器类型,还可能是指某个迭代器对象。
重点是理解存在一组概念上相关的类型,我们认定某个类型是迭代器当且仅当它支持一套操作,这套操作使得我们能访问容器的元素或者从某个元素移动到另外一个元素。 每个容器类定义了一个名为iterator的类型,该类型支持迭代器概念所规定的一套操作。结合解引用和成员访问操作(*it).empty
for(auto it = text.cbegin();it != text.cend()&& !it->empty();it++)
{
cout<<*it<<endl;
}迭代器运算,使用迭代器实现二分查找
下面的程序使用迭代器完成了二分搜索:
// text必须是有序的
//beg和 end表示我们搜索的范围
auto beg = text.begin(), end = text.end();
auto mid = text.begin() + (end - beg)/2;//初始状态下的中间点
//当还有元素尚未检查并且我们还没有找到sought时执行循环
while (mid != end && *mid != sought)
{
if (sought < *mid)//我们要找的元素在前半部分吗?
end = mid; //如果是,调整搜索范围使得忽略掉后半部分
else //我们要找的元素在后半部分
beg = mid + 1;//在mid之后寻找
mid = beg + (end - beg)/2; //新的中间点
}如果不清楚元素的确切个数,使用vector
定义和初始化内置数组
显式初始化数组
字符数组的特殊性
复杂数组,指向数组的指针,和存放指针的数组和数组的引用通过下标,访问数组元素
指针和数组,在很多用到数组名字的地方,编译器都会自动地将其替换为一个指向数组首元素的指针;
指针也是迭代器,可以使用begin和end,begin返回指向ia首元素的指针,end返回指向ia尾元素的指针
int ia[]=(0,1,2,3,4,5,6,7,8,9);//ia是一个含有10个整数的数组
int *beg = begin(ia); int *last = end(ia);
int *pbeg = begin(arr), *pend = end(arr);
while (pbeg != pend && *pbeg >= 0)
++pbeg;
指向数组的指针也具有指针运算的相关性质。C风格字符串,c风格字符串是一种约定俗成的写法,按习惯书写字符串存放在字符数组中,并以空字符结束。
c标准库string函数
strlen(p);返回p的长度,这里p是一个字符数组指针
strcmp(p1,p2);比较p1和p2的相等性,如果p1>p2返回正
strcat(p1,p2);将p2附加到p1之后,有泄漏风险
strcpy(p1,p2);将p2拷贝给p1,有泄漏风险
应当尽量减少c风格字符串的使用混用string对象和c风格字符串
string s(“Hello World”)
Char str = s;错误
const char str = s.c_str();//正确,但有风险,s变化时,str可能会失效
使用数组初始化vector
int int arr[] = {0,1, 2, 3, 4, 5};
vector ivec(begin(int arr), end(int arr));
用于初始化vector对象的值也可能仅是数组的一部分:
vector subVec(int arr + l, int arr + 4);
莫要争雄,莫要妄言,莫要怕错,安心做事。
2023年08月04日