当前位置: 首页 > news >正文

C++中常见函数

目录

stringstream ss(line);

为什么使用 stringstream

while(ss>>num){}

arr.push_back(num);

numeric_limits ::min()

pair result

throw invalid_argument("");

vector arr;和int arr[];有什么区别?

数据结构的本质

内存管理

功能与易用性

vector动态数组也要初始化吗?

为什么要初始化?

如何初始化 std::vector?

方法 1:指定大小和默认值

方法 2:使用初始化列表

方法 3:动态调整大小

方法 4:逐个添加元素

什么时候不需要初始化?

getline(cin,line);

cin.clear();

实例代码解释

cin.ignore(10000, '\n');

num.assign(kind.size(), 0);


stringstream ss(line);

需要加头文件

#include <sstream>

将字符串 line 转换为一个可以像流(stream)一样操作的对象。这样可以方便地从字符串中提取数据,比如整数、浮点数等。

这里创建了一个 stringstream 对象 ss,并将字符串 line 初始化到这个对象中

初始化后,ss 的内容就是 line 中的内容,并且可以通过流操作符(如 >>)从中提取数据

为什么使用 stringstream

用户输入了一行由空格分隔的数字(如 "5 3 9 1 7 9"),你可以使用 stringstream 将这些数字逐一提取出来,而不需要手动处理字符串分割

while(ss>>num){}

使用流操作符 >> 从 ss 中逐个提取整数

每次提取一个整数存入变量 num

提取完成后,自动跳过空格或其他分隔符

arr.push_back(num);

是 C++ 中 std::vector 容器的一个成员函数调用,用于向动态数组vector)的末尾添加一个元素

每次调用 push_backvector 的大小自动增加 1

numeric_limits<int>::min()

可以理解成获取无穷小值

pair<int, int> result

pair<int, int> 表示创建一个 pair 对象,它可以容纳两个 int 类型的值

第一个 int 可以通过 .first 访问,第二个 int 可以通过 .second 访问

throw invalid_argument("");

表示传递给函数的参数无效,通常用于处理由于输入参数不符合要求而导致的错误

vector<int> arr;和int arr[];有什么区别?

数据结构的本质

vector<int> arr;是动态数组容器

它的大小是动态的,可以根据需要自动调整大小

需要包含头文件#include <vector>

int arr[];它的大小是固定的,在定义时必须指定长度,且无法动态扩展

不需要额外的头文件

内存管理

自动管理内存:std::vector 会在内部动态分配和释放内存

元素数量超过当前容量时,vector 会自动重新分配更大的内存空间,并将旧数据复制到新空间中

int arr[];手动管理内存:数组的内存是在栈上分配的,大小固定

如果需要动态分配内存,可以使用指针和 new 操作符,但需要手动释放内存(容易导致内存泄漏)

功能与易用性

vector<int> arr;提供了许多内置方法,例如 push_back()pop_back()insert()erase() 等

支持迭代器操作,方便与 STL 算法(如 sortfind 等)结合使用

int arr[];仅支持基本的数组操作,没有内置方法

需要手动实现插入、删除等操作

vector动态数组也要初始化吗?

是的。如果你声明了一个 std::vector没有指定大小或初始值,它会创建一个空的动态数组(大小为 0)。此时,你不能直接通过索引访问元素,否则会导致未定义行为(undefined behavior)

std::vector<int> vec; // 创建一个空的 vector
vec[0] = 10;          // 错误!vec 大小为 0,无法访问索引 0

为什么要初始化?

如果你计划通过索引访问 std::vector 中的元素(例如 vec[i]),必须确保 std::vector 已经有足够的大小

如何初始化 std::vector

方法 1:指定大小和默认值
std::vector<int> vec(10, 0); // 创建大小为 10 的 vector,所有元素初始化为 0
方法 2:使用初始化列表
std::vector<int> vec = {1, 2, 3, 4, 5}; // 使用初始化列表创建 vector
方法 3:动态调整大小

先创建一个空的 std::vector,然后使用 resize 方法调整大小并初始化

std::vector<int> vec;
vec.resize(10, 0); // 调整大小为 10,所有新元素初始化为 0
方法 4:逐个添加元素
std::vector<int> vec;
vec.push_back(1);
vec.push_back(2);
vec.push_back(3);

什么时候不需要初始化?

如果你只使用 push_back 或其他动态添加元素的方法(而不通过索引访问),则不需要显式初始化

std::vector<int> vec; // 创建一个空的 vector
vec.push_back(10);    // 动态添加元素
vec.push_back(20);

getline(cin,line);

从标准输入流 cin 中读取一行文本,并将其存储到字符串变量 line 中

它会读取输入流中的所有字符,直到遇到换行符(\n)为止

cin 只能读取单个单词(以空格、制表符或换行符为分隔符),无法读取整行

getline 则可以读取整行包括空格和其他特殊字符

cin.clear();

将输入流的错误标志重置为无错误状态(即清除 failbiteofbit 等标志)

这样一来,输入流可以继续接受新的输入操作

cin.clear() 只会清除错误状态,但它不会清空输入缓冲区中的内容

实例代码解释

用户输入了一组整数,例如 1 2 3

用户输入了一个非整数值(例如字母 a),导致 cin >> num 失败

此时,cin进入错误状态failbit 被设置),并且输入缓冲区中可能还残留着未处理的字符(例如 a)。如果不处理这些错误状态和缓冲区内容,程序可能会卡住或产生意外行为

cin.ignore(10000, '\n');

10000:表示最多忽略 10000 个字符。这是一个足够大的数字,通常用来确保忽略掉缓冲区中的所有无效输入

'\n':表示以换行符为分隔符。当遇到换行符时,忽略操作会停止

忽略输入缓冲区中从当前光标位置开始所有字符,直到遇到换行符 \n 为止

num.assign(kind.size(), 0);

assign 方法会清空当前 std::vector 的内容,并将其重新初始化为指定大小和初始值的新数组

将 num 的大小调整为与 kind 相同

所有元素都被初始化为 0

相关文章:

  • 算法进阶指南 分形
  • Java垃圾回收的隐性杀手:过早晋升的识别与优化实战
  • 「合诚」携手企企通共建新材料和健康产业采购数智化新生态
  • rqlite:一个基于SQLite构建的分布式数据库
  • MySQL数据库应用技术试卷
  • main函数参数
  • PyTorch 深度学习 || 6. Transformer | Ch6.2 注意力机制
  • 使用PX4,gazebo,mavros为旋翼添加下视的相机(仿真采集openrealm数据集-第一步)
  • Java 通过 JNI 调用 C++ 动态库的完整流程
  • 获客系统 V2
  • AI一周事件(2025年3月31日至4月7日)
  • 汇丰eee2
  • LDAP高效数据同步:Syncrepl复制模式实战指南
  • 【AI】Ragflow构建本地知识库
  • 数据结构与算法-数学-容斥原理,高斯消元解线性方程组
  • (C语言)双向链表(教程)(指针)(数据结构)
  • 从表格到序列:Swift 如何优雅地解 LeetCode 251 展开二维向量
  • 【JAVA】十、基础知识“类和对象”干货分享~(三)
  • HYCX笔试
  • GNSS有源天线和无源天线
  • 宜昌全域高质量发展:机制创新与产业重构的双向突围
  • 深圳市政协原副主席王幼鹏被“双开”
  • 中国金茂新任命三名副总裁,撤销区域公司
  • 中国象棋协会坚决支持司法机关依法打击涉象棋行业的违法行为
  • 妻子藏匿一岁幼儿一年多不让丈夫见,法院发出人格权侵害禁令
  • 对话哭泣照被恶意盗用成“高潮针”配图女生:难过又屈辱