C++中常见函数
目录
stringstream ss(line);
为什么使用 stringstream
while(ss>>num){}
arr.push_back(num);
throw invalid_argument("");
数据结构的本质
内存管理
功能与易用性
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_back
,vector
的大小会自动增加 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 算法(如 sort
、find
等)结合使用
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();
将输入流的错误标志位重置为无错误状态(即清除 failbit
、eofbit
等标志)
这样一来,输入流可以继续接受新的输入操作
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