免责声明:链接指向 cppreference.com
所以我早就知道std::atoi已被弃用,建议改用std::strtol。
C++11 引入了std::stoi,我试图理解为什么人们会选择使用它而不是std::strtol
.
据我了解,stoi 调用 strtol 但抛出异常。它还返回一个整数而不是长整数。
这些是主要区别吗,我错过了什么?
免责声明:链接指向 cppreference.com
所以我早就知道std::atoi已被弃用,建议改用std::strtol。
C++11 引入了std::stoi,我试图理解为什么人们会选择使用它而不是std::strtol
.
据我了解,stoi 调用 strtol 但抛出异常。它还返回一个整数而不是长整数。
这些是主要区别吗,我错过了什么?
这些是主要区别吗,我错过了什么?
较新的版本std::stoi
也可以直接使用std::string
(因此您不必在调用中乱扔代码),并且可以选择通过 a.c_str()
为您提供第一个不匹配的字符作为索引size_t
,而不是作为指针。
这些更改简化了代码中的使用。
一个很大的区别是它stoi
以 anstd::string
作为参数,因此您不必附加.c_str()
字符串即可将其转换为整数。
如果要转换为 a long
,则可以stol
改用(同样,stod
, stof
stold
, stoul
,分别stoll
转换为double,
float
, long double
, unsigned long
, and long long
)。
我更喜欢 stoi() 而不是 strtol() 因为前者在无效输入上抛出 std::invalid_argument 。糟糕的是 GNUs libstdc++ 中的异常消息并没有帮助。例如:“what(): stoi”
如果你想std::stoi()
通过 astd::basic_string
并且你想退出一个int
. 如果你想出去,long
你会打电话给std::stol()
.
std:stoi
与 C 不兼容,并且与<string>
具有其他无法由 C 编译器编译的面向对象实现的库一起打包。它的主要用例场景(应该)涉及 std:string 而不是字节数组,以符合现代 C++ 惯例。
实际上,我真的很想知道为什么没有 std::FromString 模板函数将您希望将字符串转换为模板参数的类型作为模板参数。同样,执行相反操作的 ToString 模板函数。
您可以轻松想象使用插入和提取运算符的实现。
int i = std::FromString <int> (std::string ("2"))
int j = std::FromString <int> ("2")
std::string = ToString <double> (3.14159)
是的,当然函数名称不会有大写字母,它们可能是 from_string 和 to_string 。
当然,模板专业化是可能的。最后,类型必须是本机类型真的没有限制,对吧?