免责声明:链接指向 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 。
当然,模板专业化是可能的。最后,类型必须是本机类型真的没有限制,对吧?