通过全局模板函数实现自定义vector的输出流操作符

  |  

摘要: 自定义 vector 的 << 操作符

【对算法,数学,计算机感兴趣的同学,欢迎关注我哈,阅读更多原创文章】
我的网站:潮汐朝夕的生活实验室
我的公众号:算法题刷刷
我的知乎:潮汐朝夕
我的github:FennelDumplings
我的leetcode:FennelDumplings


在使用 std::vector<T> 时,经常需要在调试的时候打印 vector 中的内容。每次打印的时候都写一个循环,一个元素一个元素地打印会比较麻烦。本文看一下自定义输出流操作符的方式。

在 C++ 中,重载一个类的输出流操作符 << 是一种常见的做法,它允许你自定义如何将类的实例输出到流(标准输出或文件)。对于 std::vector,你可以定义一个全局的函数模板,使其能够处理任何类型的 vector。

下面是一个例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <iostream>
#include <vector>

// 定义一个模板函数,用于输出任何类型的vector
template<typename T>
std::ostream& operator<<(std::ostream& os, const std::vector<T>& vec) {
os << "[";
for (size_t i = 0; i < vec.size(); ++i) {
os << vec[i];
if (i < vec.size() - 1) {
os << ", ";
}
}
os << "]";
return os;
}

int main() {
std::vector<int> vecInt = {1, 2, 3, 4, 5};
std::vector<double> vecDouble = {1.1, 2.2, 3.3};
std::vector<std::string> vecString = {"hello", "world"};

std::cout << "Vector of ints: " << vecInt << std::endl;
std::cout << "Vector of doubles: " << vecDouble << std::endl;
std::cout << "Vector of strings: " << vecString << std::endl;

return 0;
}

在这个例子中,我们定义了一个模板函数 operator<<,它接受一个输出流 std::ostream 的引用和一个 std::vector 的常量引用。函数内部,我们遍历向量中的每个元素,并将它们输出到流中,元素之间用逗号分隔。最后,我们返回流的引用,以便进行链式调用

输出结果如下:

1
2
3
Vector of ints: [1, 2, 3, 4, 5]
Vector of doubles: [1.1, 2.2, 3.3]
Vector of strings: [hello, world]

Share