第二天的学习,对day1的知识点进行补充。
所有标准库容器都可以使用迭代器,它的对象是容器中的元素或string对象中的字符,有迭代器的类型同时拥有返回迭代器的成员,使用迭代器可以访问某个元素或对其进行 *** 作,迭代器和指针类似,有有效与无效之分。
其中,
begin成员返回指向容器第一个元素的迭代器;
end成员返回指向容器尾元素的下一位置的迭代器;
例如:
auto b = v.begin(), e = v.end();
b表示v的首元素,e表示v尾元素的下一位置,它们的类型与begin和end的返回值类型相同
标准容器迭代器的运算符:
运算符 | 含义 |
---|---|
*iter | 返回迭代器所指元素的引用 |
iter->mem | 解引用iter并获取该元素的名为mem的成员,等价于(*iter).mem |
++iter | 令iter指向容器中的下一个元素 |
–iter | 令iter指向容器中的上一个元素 |
iter1 == iter2 | 判断两个迭代器是否相等,如果两个迭代器指向同一元素或是同一个容器的尾后迭代器则相等 |
iter1 != iter2 |
注:凡是使用了迭代器的循环体,都不要向迭代器所属的容器添加元素。
vector和string提供了更多的运算符:
运算符 | 含义 |
---|---|
iter + n | 迭代器指向的位置向前移动n个位置 |
iter - n | 迭代器指向的位置向后移动n个位置 |
iter += n | 将iter加n的结果赋给iter |
iter -= n | 将iter减n的结果赋给iter |
iter1 - iter2 | 计算两个迭代器之间的距离 |
>、>=、<、<= | 关系运算, 比较两迭代器指向元素位置的前后关系 |
在初入C++时,会发现和C的头文件引用有了区别,我们用了#include
iostream库包含两个基础类型istream和ostream,分别表示输入流和输出流,流的意思是字符是顺序生成或消耗的。
标准库定义了四个IO对象:
- 输入,使用名为cin的istream类型的对象;
- 输出,使用名为cout的ostream类型的对象;
- 输出警告和错误信息,使用名为cerr的ostream类型的对象;
- 输出程序运行时的一般性信息,使用名为clog的ostream类型的对象。
1.结合输出运算符<<,可以完成以下操作:
std::cout << "hello world" << std::endl;
第一个<<运算符将右侧给定的值(“hello world”)写到左侧给定的ostream对象(cout)中,下一个<<运算符又将endl写到左侧的新对象中。
其中endl是一个被称为 *** 纵符的特殊值,写入它的效果是结束当前行并将缓冲区中的内容刷到设备中。
2.结合输入运算符>>,可以完成以下 *** 作:
int v1 =0, v2 = 0;
std::cin >> v1 >> v2;
同理,>>从左侧给定的istream(cin)读入数据,并存给右侧的给定对象(v1),返回左侧的对象作为计算结果,第二个>>又重复了一遍上述 *** 作,即从cin中读入两个值,分别存入v1和v2中。
我们可以发现程序中使用std::cout而不是cout,因为前缀std::指出名字cout是定义在名为std的命名空间中的。
命名空间可以帮助我们避免名字定义冲突,以及使用库中相同名字导致的冲突,标准库定义的所有名字都在std中。
其中::是作用域运算符,它指出我们想使用定义在命名空间std中的名字cout。
每次都使用std::cout太过于麻烦,我们可以对命名空间进行using声明,声明后就无需前缀也能使用所需的名字了。
using声明的格式:using namespace::name;
例如,
#include
using std::cin;
using std::cout;
using std::endl;
于是,我们就可以愉快地直接使用cin, cout, endl了。
注:头文件中不应包含using声明。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)