8

免责声明:链接指向 cppreference.com

所以我早就知道std::atoi已被弃用,建议改用std::strtol

C++11 引入了std::stoi,我试图理解为什么人们会选择使用它而不是std::strtol.

据我了解,stoi 调用 strtol 但抛出异常。它还返回一个整数而不是长整数。

这些是主要区别吗,我错过了什么?

4

6 回答 6

9

这些是主要区别吗,我错过了什么?

较新的版本std::stoi也可以直接使用std::string(因此您不必在调用中乱扔代码),并且可以选择通过 a.c_str()为您提供第一个不匹配的字符作为索引size_t,而不是作为指针。

这些更改简化了代码中的使用。

于 2013-10-08T22:51:38.903 回答
2

一个很大的区别是它stoi以 anstd::string作为参数,因此您不必附加.c_str()字符串即可将其转换为整数。

如果要转换为 a long,则可以stol改用(同样,stod, stof stold, stoul,分别stoll转换为double, float, long double, unsigned long, and long long)。

于 2013-10-08T22:50:51.823 回答
2

我更喜欢 stoi() 而不是 strtol() 因为前者在无效输入上抛出 std::invalid_argument 。糟糕的是 GNUs libstdc++ 中的异常消息并没有帮助。例如:“what(): stoi”

于 2014-02-07T16:06:49.980 回答
2

如果你想std::stoi()通过 astd::basic_string并且你想退出一个int. 如果你想出去,long你会打电话给std::stol().

于 2013-10-08T22:51:51.753 回答
0

std:stoi与 C 不兼容,并且与<string>具有其他无法由 C 编译器编译的面向对象实现的库一起打包。它的主要用例场景(应该)涉及 std:string 而不是字节数组,以符合现代 C++ 惯例。

于 2013-10-08T22:54:08.777 回答
-2

实际上,我真的很想知道为什么没有 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 。

当然,模板专业化是可能的。最后,类型必须是本机类型真的没有限制,对吧?

于 2013-10-08T23:01:18.907 回答