【无标题】类型之间的转换
std::stoi
和 (int)
在功能和用途上有显著的区别,主要体现在 转换的对象 和 转换过程 上。
1. (int)
(C 风格强制类型转换)
用途
(int)
是一种 类型转换操作符,用于将 基本数据类型 直接强制转换为int
类型。- 它只适用于能够直接进行类型转换的值,例如
float
转int
,或者double
转int
。
特点
- 直接操作内存中的值:
(int)
不涉及复杂的解析或转换逻辑,只是将数值按整数类型解释。
- 不能用于字符串到整数的转换:
- 例如
(int)"42"
是不合法的,因为字符串和整数之间无法直接转换。
- 例如
示例
#include <iostream>
using namespace std;
int main() {
double pi = 3.14159;
int truncated = (int)pi; // 截断小数部分,转换为 3
cout << "Truncated value: " << truncated << endl; // 输出 "3"
return 0;
}
适用场景
- 用于从 数值类型(如
float
、double
、long
) 转换为int
。 - 不涉及复杂解析逻辑。
2. std::stoi
(C++11 引入的标准库函数)
用途
std::stoi
是一个标准库函数,用于将字符串解析为整数。- 它可以处理字符串形式的数值,例如
"42"
转换为整数42
。
特点
-
解析字符串:
std::stoi
会解析字符串,提取其中的数字部分。- 支持忽略字符串开头的空格。
- 如果字符串中包含非数字字符(如字母),会抛出异常。
-
支持异常处理:
- 如果字符串无法转换为整数(例如包含非法字符),
std::stoi
会抛出std::invalid_argument
异常。
- 如果字符串无法转换为整数(例如包含非法字符),
-
支持进制转换:
- 可以通过额外参数指定字符串的数值进制(如二进制、十六进制)。
示例
#include <iostream>
#include <string>
using namespace std;
int main() {
string s = "42";
try {
int num = stoi(s); // 转换为整数 42
cout << "Converted value: " << num << endl; // 输出 "42"
} catch (const invalid_argument &e) {
cout << "Invalid input: " << e.what() << endl;
}
return 0;
}
适用场景
- 用于从 字符串类型(
std::string
或 C 风格字符串) 转换为整数。 - 适用于需要处理用户输入、配置文件或其他字符串数据的场景。
3. 二者的比较
特性 | (int) | std::stoi |
---|---|---|
用途 | 转换基本类型为 int | 将字符串解析为 int |
适用的输入类型 | 基本数据类型(float , double ) | 字符串(std::string 或 C 风格字符串) |
复杂性 | 简单直接,按类型解释内存中的值 | 涉及字符串解析逻辑 |
支持进制 | 不支持 | 支持,默认 10,可指定其他进制 |
支持异常处理 | 不支持 | 支持,抛出 std::invalid_argument 或 std::out_of_range |
效率 | 高(直接操作内存) | 略低(需要解析字符串) |
典型使用场景 | 数值截断或类型转换 | 字符串数据解析 |
4. 示例对比
场景 1:从浮点数转换为整数
-
使用
(int)
:double value = 3.99; int result = (int)value; // 截断小数部分,结果为 3
-
使用
std::stoi
(不可行):double value = 3.99; int result = stoi(value); // 错误,不能将非字符串传递给 stoi
场景 2:从字符串转换为整数
-
使用
std::stoi
:string s = "42"; int result = stoi(s); // 结果为 42
-
使用
(int)
(不可行):string s = "42"; int result = (int)s; // 错误,字符串不能直接转换为 int
场景 3:处理非法输入
-
使用
std::stoi
:string s = "abc"; try { int result = stoi(s); // 抛出异常 } catch (const invalid_argument &e) { cout << "Invalid input!" << endl; }
-
使用
(int)
:- 不适用,因为
(int)
只适用于基本类型,不能处理字符串输入。
- 不适用,因为
5. 总结与推荐
选择场景 | 推荐方法 |
---|---|
需要将浮点数、基本数据类型转换为整数 | (int) 或 static_cast<int> |
需要从字符串解析数字 | std::stoi 或 std::stol |
需要处理字符串中非法输入或支持异常处理 | std::stoi |
性能敏感的数值转换 | (int) |
-
(int)
:- 简单直接,适合基本类型之间的转换。
- 不适合处理字符串。
- 推荐在现代 C++ 中用
static_cast<int>
替代。
-
std::stoi
:- 用于解析字符串中的数值。
- 更灵活,支持异常处理和进制转换。
- 更适合字符串数据的转换场景。
C++ 标准库中并没有直接提供类似 to_int
或 to_double
的函数来将字符串转换为整数或浮点数,但可以通过以下几种方式实现相同的功能。以下是 C++ 中常用的字符串到数字转换方法:
1. 使用 std::stoi
, std::stol
, std::stod
等函数(C++11 引入)
C++11 引入的转换函数
函数 | 功能 |
---|---|
std::stoi | 将字符串转换为 int |
std::stol | 将字符串转换为 long |
std::stoll | 将字符串转换为 long long |
std::stof | 将字符串转换为 float |
std::stod | 将字符串转换为 double |
std::stold | 将字符串转换为 long double |
语法
int stoi(const std::string& str, size_t* pos = 0, int base = 10);
long stol(const std::string& str, size_t* pos = 0, int base = 10);
double stod(const std::string& str, size_t* pos = 0);
str
:输入的字符串。pos
(可选):存储转换停止的位置。base
(可选):表示字符串中数字的进制(默认为 10)。
示例
#include <iostream>
#include <string>
using namespace std;
int main() {
string s1 = "42";
string s2 = "3.14159";
int num = stoi(s1); // 转换为 int
double pi = stod(s2); // 转换为 double
cout << "Integer: " << num << endl; // 输出 "Integer: 42"
cout << "Double: " << pi << endl; // 输出 "Double: 3.14159"
return 0;
}
特性
- 支持指定进制(如二进制、十六进制等)。
- 只能转换数字开头的字符串,非数字部分会被忽略或抛出异常。
2. 使用 std::istringstream
概述
std::istringstream
是 C++ 标准库中提供的输入流类,适合将字符串解析为数字。
示例
#include <iostream>
#include <sstream>
using namespace std;
int main() {
string s1 = "42";
string s2 = "3.14159";
istringstream iss1(s1), iss2(s2);
int num;
double pi;
iss1 >> num; // 转换为 int
iss2 >> pi; // 转换为 double
cout << "Integer: " << num << endl; // 输出 "Integer: 42"
cout << "Double: " << pi << endl; // 输出 "Double: 3.14159"
return 0;
}
优点
- 灵活,可以解析复杂格式的字符串。
- 支持各种数据类型。
3. 使用 std::from_chars
(C++17 引入)
概述
std::from_chars
是一个高效的低级接口,用于将字符串解析为数字。它不会动态分配内存,因此性能优于其他方法。
语法
std::from_chars(const char* first, const char* last, T& value, int base = 10);
first
:字符串起始位置。last
:字符串结束位置。value
:输出的数字变量。base
:进制,默认为 10。
示例
#include <iostream>
#include <charconv>
using namespace std;
int main() {
string s = "42";
int num;
auto result = from_chars(s.data(), s.data() + s.size(), num);
if (result.ec == errc()) {
cout << "Integer: " << num << endl; // 输出 "Integer: 42"
} else {
cout << "Conversion failed!" << endl;
}
return 0;
}
特点
- 性能最佳,不会分配额外内存。
- 不支持浮点数。
4. 使用 C 风格的 atoi
, atof
(不推荐)
函数
函数 | 功能 |
---|---|
atoi | 将 C 风格字符串转换为 int |
atol | 将 C 风格字符串转换为 long |
atof | 将 C 风格字符串转换为 double |
示例
#include <iostream>
#include <cstdlib> // 包含 atoi, atof
using namespace std;
int main() {
const char* s1 = "42";
const char* s2 = "3.14159";
int num = atoi(s1); // 转换为 int
double pi = atof(s2); // 转换为 double
cout << "Integer: " << num << endl; // 输出 "Integer: 42"
cout << "Double: " << pi << endl; // 输出 "Double: 3.14159"
return 0;
}
缺点
- 不支持异常处理。
- 输入格式错误时,可能返回未定义行为。
方法对比
方法 | 引入版本 | 支持的类型 | 性能 | 优点 | 缺点 |
---|---|---|---|---|---|
std::stoi 等 | C++11 | 整数、浮点数 | 较高 | 简单易用,支持异常处理 | 只能处理 std::string |
std::istringstream | C++98 | 整数、浮点数 | 较低 | 灵活,支持复杂解析 | 语法稍显冗长 |
std::from_chars | C++17 | 整数 | 高 | 性能最佳,低级、高效 | 不支持浮点数 |
atoi , atof | C | 整数、浮点数 | 高 | 简单、历史悠久 | 不支持异常处理,错误处理差 |
建议选择
-
简单转换(推荐
std::stoi
和std::stod
)- 如果只是简单地将字符串转换为数字,
std::stoi
、std::stol
、std::stod
是最直接的方法。
- 如果只是简单地将字符串转换为数字,
-
性能要求较高(推荐
std::from_chars
)- 在性能敏感的场景下,
std::from_chars
是最佳选择,尤其适合大规模数字转换。
- 在性能敏感的场景下,
-
兼容性需求(
atoi
和atof
)- 如果需要与旧代码兼容,可以使用
atoi
和atof
,但需谨慎处理异常情况。
- 如果需要与旧代码兼容,可以使用
原文地址:https://blog.csdn.net/qq_46243318/article/details/145143218
免责声明:本站文章内容转载自网络资源,如侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!