C++基础(二)

一、迭代器(iterator)介绍
使用下标可以访问string对象的字符或者vector对象的元素,而除此之外还有一种方式可以实现这样的操作,就是迭代器。
1、使用迭代器
和指针不一样的是,获取迭代器不是使用取地址符,有迭代器的类型同时拥有返回迭代器的成员。标准容器的迭代器运算符如下:

*iter ;  //返回迭代器所指元素的引用
iter->mem ;  //解引用iter并获取该元素名为mem的成员
++iter ;  //指向容器中的下一个元素
iter1 !===)iter2;  //判断是否相等

使用迭代器访问元素代码:

string s1("hello world!");
if (s1.begin() != s1.end())
{
	auto it = s1.begin();
	*it = toupper(*it);
	cout << s1 << endl;

}

创建一个迭代器访问string对象内的所有元素并将其改为大写

string my_itera(string s)
{
	if (s.begin() != s.end())
	{
		auto iter = s.begin();
		for (int i = 0; i < s.size() - 1; i++)
		{
			*iter = toupper(*iter);
			iter++;
		}
		cout << s << endl;
		return s;
	}

}

思考:本来以为解引用操作可以传入的string对象进行操作,不返回值也可以,但是事实证明这种想法是错误的,这里解引用也是对形参s进行解引用,而不会对原string类产生影响。
注: 某些对vector对象的操作会使迭代器失效,比如任何一种可能改变vector对象容量的操作,比如push_back,都会使该对象的迭代器失效。

2、迭代器运算
迭代器的递增运算令迭代器每次移动一个元素,所有的标准库容器都支持递增运算的迭代器。类似的,也能用 ==和!=对任意标准库类型的两个有效迭代器进行比较。
开头已经提到了一部分迭代器的运算,这里不再列出,下面利用迭代器设计一个二分查找的函数,返回查找值。

void Bi_search(vector<int> arr, int target)
{
	auto begin = arr.begin();
	auto end = arr.end();
	auto mid = begin + (end - begin) / 2;
	while (mid<end&&*mid!=target)
	{
		if (*mid < target && begin < end-1)
			{
				begin = mid+1;
			}
		else
				end = mid;
		mid = begin + (end - begin) / 2;	
	}
	if (*mid == target)
		cout << "find number:"<< * mid << endl;
	else if(mid == end )
		cout << "no find" << endl;
}

注:C++Primer书中给出的代码存在指针越界的问题(也可能是我敲错了),这里进行一些更正并且个人使用不会报错。

二、运算符
运算符的一些概念不再赘述,下面写一些看书时个人觉得该记下来的知识点。
1、在一条语句中混用解引用与递增运算符

cout<< *v++<<endl;

该语句的执行顺序为:首先输出当前解引用的值,然后再将v向前移动一个元素。
2、括号可以改变运算符的优先级

a = (1 + 2 + 3) * 4;     // 6 * 4
a = 1 + 2 + 3 * 4; // 3+12

3、位运算符和逻辑运算符完全不同

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐