Skip to content

I/Ostream

fstream

在这个库中分别有两个类可供使用,分别是 ifstream 和 ofstream.

ifstream 和 ofstream 分别用来读取和写入文件,ifstream 读取文件,ofstream 写入文件.

常见的将文件中的内容读取

c++
#include <iostream>
#include <fstream>

using namespace std;

int main() {
    ifstream inputFile("input.txt"); // 打开文件
    if (!inputFile) { // 判断文件是否打开成功
        cout << "Error: unable to open input file" << endl;
        return 1;
    }

    string line;
    while (getline(inputFile, line)) { // 读取文件内容
        cout << line << endl;
    }

    inputFile.close(); // 关闭文件
    return 0;
}

常见的向文件中写入内容

c++
#include <iostream>
#include <fstream>

using namespace std;

int main() {
    ofstream outputFile("output.txt"); // 打开文件
    if (!outputFile) { // 判断文件是否打开成功
        cout << "Error: unable to open output file" << endl;
        return 1;
    }

    outputFile << "Hello, world!" << endl; // 写入内容
    outputFile.close(); // 关闭文件
    return 0;
}

vector and grid

#include "vector.h"

这是斯坦福库中的一个头文件,里面包含了一些常用的向量操作函数,包括向量的初始化,向量的元素的访问,向量的插入,删除,查找等.

vector 避免了 c++数组的一些缺点,比如数组的大小是固定的,而 vector 的大小可以根据需要动态调整.

vector 的 insert 和 remove:

c++
#include "vector.h"

int main() {
    Vector<int> v;   // 声明一个向量
    v.insert(0, 1);  // 在索引0处插入元素1
    v.insert(1, 2);  // 在索引1处插入元素2
    v.insert(2, 3);  // 在索引2处插入元素3
    v.remove(1);     // 删除索引1处的元素
    for (int i = 0; i < v.size(); i++) {
        cout << v[i] << " ";
    }
    cout << endl;    // 输出: 1 3
    return 0;
}

其中的原理是通过指针来实现的,通过指针可以直接访问 vector 中的元素,而不需要像数组那样通过下标来访问.

#include "grid.h"

这是斯坦福库中的另一个头文件,里面包含了一些常用的网格操作函数,包括网格的初始化,网格的元素的访问,网格的插入,删除,查找等.

grid 和 vector 类似,也是通过指针来实现的,通过指针可以直接访问网格中的元素,而不需要像数组那样通过下标来访问.

和二元数组不同的是,网格可以有多个维度,比如二维网格,三维网格等.

grid 的遍历一般使用两个循环,第一个循环遍历行,第二个循环遍历列

vector and grid 的传递

值传递会复制一遍整个向量或网格,引用传递不会复制,而是直接传递指针,因此如果需要修改向量或网格中的元素,需要使用引用传递.

c++
#include "vector.h"

int main() {
    Vector<int> v1;
    v1.insert(0, 1);
    v1.insert(1, 2);
    v1.insert(2, 3);

    Vector<int> v2(v1); // 值传递
    for (int i = 0; i < v2.size(); i++) {
        cout << v2[i] << " ";
    }
    cout << endl;    // 输出: 1 2 3

    Vector<int>& v3 = v1; // 引用传递
    for (int i = 0; i < v3.size(); i++) {
        cout << v3[i] << " ";
    }
    cout << endl;    // 输出: 1 2 3

    v3.insert(0, 4);
    for (int i = 0; i < v1.size(); i++) {
        cout << v1[i] << " ";
    }
    cout << endl;    // 输出: 4 1 2 3
    return 0;
}

而是用 const 修饰的引用传递,可以防止修改原来的对象,但是不能修改元素的值.