C++基础(C++Primer学习)
C++基础(二)一、迭代器(iterator)介绍使用下标可以访问string对象的字符或者vector对象的元素,而除此之外还有一种方式可以实现这样的操作,就是迭代器。1、使用迭代器和指针不一样的是,获取迭代器不是使用取地址符,有迭代器的类型同时拥有返回迭代器的成员。标准容器的迭代器运算符如下:*iter ;//返回迭代器所指元素的引用iter->mem ;//解引用iter并获取该元素名
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、位运算符和逻辑运算符完全不同
更多推荐
所有评论(0)