I/O Streams;Vector and Grid


I/O Streams

#incldue<fstream>

类层次关系

操作方式

  1. 创建文件流对象
  2. 打开磁盘文件
  • 将该文件流对象与指定文件建立关联,使文件流能流向指定的磁盘文件
  • 指定工作方式
  • 实现方式:
  • 调用成员函数 open,如下 eg
    object.open(文件路径,I/O模式);

  • 创建文件流对象时指定参数
    class_name object(文件路径,I/O模式);

  1. 输入输出
  • 每次读写都从文件指针的当前位置开始,读入一个字节,指针就后移一个字节,读写至文件结束符停止
  • 输入流常用方法

  1. 关闭磁盘文件
  • obj.close();

eg:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//getline整行读入
#include <iostream>
#include<string>
#include<fstream>
using namespace std;

int main()
{
ifstream input;
input.open("./files/hello.txt");
if (input.fail()) {
cout << "error!" << endl;
}
string line;
while (getline(input, line))
{
cout << line << endl; //getline从输入流中读入整行字符,存到string变量,返回值类型为bool
}
input.close();
}
1
2
3
4
5
//>>流提取运算符逐个word读入
while (input >> line)
{
cout << line << endl;
}

Vector


STL Vector

vector 是向量类型,它可以容纳许多类型的数据,所以称其为容器,是由 STL 提供的一种序列式容器,它的底层其实就是一个动态数组

vector 常用构造函数

| |
| :-: | :-: |
| vector(); | 创建一个没有任何元素的空向量 |
| vector(vector&& _Right); | 创建一个向量,并使用向量_Right 初始化该向量 |
| vector(size_type Count); | 创建一个大小为 Count 的向量 vect |
| vector(size_type Count,const Type& Val); | 创建一个大小为 Count 的向量,该向量中所有的元素都初始化为 Val |
| template vector(InputIterator _first,InputIterator _last); | 创建一个向量,并以迭代器_first 和_last 之间的元素初始化该向量 |

方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include<vector> //需要包含头文件
a.assign(c.begin(), c.begin() + 3); //将c的0~2个元素构成的向量赋给a
a.assign(4, 2); //a只含4个元素,且每个元素为2
a.back(); //返回a的最后一个元素;
a.front(); //返回a的第一个元素
a[i];//返回a的第i个元素,当且仅当a[i]存在,才可使用下标索引
a.clear(); //清空a中的元素
a.empty(); //判断a是否为空,空则返回ture,不空则返回false
a.pop_back(); //删除a向量的最后一个元素
a.push_back(5); //在a的最后一个向量后插入一个元素,其值为5
a.erase(a.begin() + 1, a.begin() + 3); //删除a中第1个(从第0个算起)到第2个元素,也就是说删除的元素从a.begin()+1算起(包括它)一直到a.begin()+3(不包括它)
a.insert(a.begin() + 1, 5); //在a的第1个元素(从第0个算起)的位置插入数值5,如a为1,2,3,4,插入元素后为1,5,2,3,4
a.insert(a.begin() + 1, 3, 5); //在a的第1个元素(从第0个算起)的位置插入3个数,其值都为5
a.insert(a.begin() + 1, b + 3, b + 6); //b为数组,在a的第1个元素(从第0个算起)的位置插入b的第3个元素到第5个元素(不包括b+6),如b为1,2,3,4,5,9,8 ,插入元素后为1,4,5,9,2,3,4,5,9,8
a.size(); //返回a中元素的个数;
a.resize(10); //将a的现有元素个数调至10个,多则删,少则补,其值随机
a.resize(10, 2); //将a的现有元素个数调至10个,多则删,少则补,其值为2
a.swap(c); //c为向量,将a中的元素和c中的元素进行整体性交换

二维向量

1
2
vector <int*> a;
vector <vector <int>> b; //二维向量由若干一维向量组成

向量的遍历

  1. 下标
  2. 遍历器
1
2
for(vector<int>::iterator it=b.begin();it!=b.end();it++)
cout<<*it<<" ";
  1. for
1
for (type x : vector) {x...}  //x需要与vector类型一致

重要算法

1
2
3
4
5
6
7
8
#include<algorithm>
sort(a.begin(),a.end()); //对a中的从a.begin()(包括它)到a.end()(不包括它)的元素进行从小到大排列

reverse(a.begin(),a.end()); //对a中的从a.begin()(包括它)到a.end()(不包括它)的元素倒置,但不排列,如a中元素为1,3,2,4,倒置后为4,2,3,1

copy(a.begin(),a.end(),b.begin()+1); //把a中的从a.begin()(包括它)到a.end()(不包括它)的元素复制到b中,从b.begin()+1的位置(包括它)开 始复制,覆盖掉原有元素

find(a.begin(),a.end(),10); //在a中的从a.begin()(包括它)到a.end()(不包括它)的元素中查找10,若存在返回其在向量中的位置

Standford C++ library SPL vector

定义:


方法

Grid 网格

定义:


方法:

遍历:

!!!大作业待完成