自学内容网 自学内容网

【无标题】类型之间的转换

std::stoi(int) 在功能和用途上有显著的区别,主要体现在 转换的对象转换过程 上。


1. (int)(C 风格强制类型转换)

用途
  • (int) 是一种 类型转换操作符,用于将 基本数据类型 直接强制转换为 int 类型。
  • 它只适用于能够直接进行类型转换的值,例如 floatint,或者 doubleint
特点
  1. 直接操作内存中的值
    • (int) 不涉及复杂的解析或转换逻辑,只是将数值按整数类型解释。
  2. 不能用于字符串到整数的转换
    • 例如 (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;
}
适用场景
  • 用于从 数值类型(如 floatdoublelong 转换为 int
  • 不涉及复杂解析逻辑。

2. std::stoi(C++11 引入的标准库函数)

用途
  • std::stoi 是一个标准库函数,用于将字符串解析为整数。
  • 它可以处理字符串形式的数值,例如 "42" 转换为整数 42
特点
  1. 解析字符串

    • std::stoi 会解析字符串,提取其中的数字部分。
    • 支持忽略字符串开头的空格。
    • 如果字符串中包含非数字字符(如字母),会抛出异常。
  2. 支持异常处理

    • 如果字符串无法转换为整数(例如包含非法字符),std::stoi 会抛出 std::invalid_argument 异常。
  3. 支持进制转换

    • 可以通过额外参数指定字符串的数值进制(如二进制、十六进制)。
示例
#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_argumentstd::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::stoistd::stol
需要处理字符串中非法输入或支持异常处理std::stoi
性能敏感的数值转换(int)
  • (int)

    • 简单直接,适合基本类型之间的转换。
    • 不适合处理字符串。
    • 推荐在现代 C++ 中用 static_cast<int> 替代。
  • std::stoi

    • 用于解析字符串中的数值。
    • 更灵活,支持异常处理和进制转换。
    • 更适合字符串数据的转换场景。

C++ 标准库中并没有直接提供类似 to_intto_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::stoiC++11整数、浮点数较高简单易用,支持异常处理只能处理 std::string
std::istringstreamC++98整数、浮点数较低灵活,支持复杂解析语法稍显冗长
std::from_charsC++17整数性能最佳,低级、高效不支持浮点数
atoi, atofC整数、浮点数简单、历史悠久不支持异常处理,错误处理差

建议选择

  1. 简单转换(推荐 std::stoistd::stod

    • 如果只是简单地将字符串转换为数字,std::stoistd::stolstd::stod 是最直接的方法。
  2. 性能要求较高(推荐 std::from_chars

    • 在性能敏感的场景下,std::from_chars 是最佳选择,尤其适合大规模数字转换。
  3. 兼容性需求(atoiatof

    • 如果需要与旧代码兼容,可以使用 atoiatof,但需谨慎处理异常情况。


原文地址:https://blog.csdn.net/qq_46243318/article/details/145143218

免责声明:本站文章内容转载自网络资源,如侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!