What are the differences between std::strtol and std::stoi?
免责声明:链接至cppreference.com
所以一段时间以来我就知道std :: atoi已被弃用,建议改用std :: strtol。
C 11引入了std :: stoi,我试图理解为什么人们会选择在std::strtol上使用它。
据我了解,stoi调用strtol但抛出异常。而且它返回一个整数而不是long。
这些主要区别是什么,我想念什么?
- 为什么没有std :: stou的可能重复项?
-
@KerrekSB这确实是一个不相关的问题...
-
@KerrekSB我的问题是更好地了解为什么如果最终只是调用strtol来使用stoi。
-
std::atoi尚未被弃用。在C标准中已弃用,以表示将来可能会消失。有些人不同意atoi;那不是弃用。
-
取自atoi的FreeBSD手册页:The atoi() function has been deprecated by strtol() and should not be used in new code.这可能仅适用于FreeBSD,但就可移植性而言,这使我倾向于不在生产代码中使用它。
-
@jmstoker atoi的Linux手册页没有提及任何过时的内容。但是由于atoi()无法检测到错误,因此我肯定会/ not /在生产代码中使用它!
Are these the main differences, what am I missing?
较新的std::stoi也可以直接在std::string中使用(因此您不必通过.c_str()调用来乱码),并可以选择通过size_t为您提供第一个不匹配的字符作为索引,而不是作为指针。
这些更改简化了代码中的用法。
- 因此,可以安全地假设stoi提供了便利,但由于内部转换来转换字符串并返回int而以一些开销为代价吗?
-
@jmstoker我怀疑您不会有太多的开销,因为如果您使用std::string作为输入,则必须进行相同的转换。
-
是的,我只是想知道stoi中是否还有其他事情,例如提供异常的逻辑。我可能已经过分析了,但是它引起了我的兴趣。
-
@jmstoker我怀疑异常逻辑更多地是对std::strtol结果的格式检查,因为它返回错误代码而不是异常。成功的话,开销可能非常低。
-
相反,如果您的字符串数据未存储在std::string中(也许它是一个内存映射的文本文件),则strtol的使用要简单得多。
相对于strtol(),我更喜欢stoi(),因为前者在无效输入上抛出std :: invalid_argument。破坏GNU libstdc中的异常消息没有帮助。例如:" what():stoi"
如果要传递std::basic_string并且想要获取int,则可以使用std::stoi()。如果您想退出long,请致电std::stol()。
一个很大的区别是stoi将std::string作为其参数,因此您不必将.c_str()附加到字符串上即可将其转换为整数。
如果要转换为long,则可以改用stol(同样,stod,stof stold,stoul,stoll可以转换为double, float,long double,unsigned long和long long)。
std:stoi与C不兼容,并且与<string>库一起打包,该库具有其他面向对象的实现,这些实现不能由C编译器编译。它的主要用例场景(应该)涉及std:string而不是字节数组,以符合现代C的惯例。
实际上,我真的很奇怪为什么没有std :: FromString模板函数将要将字符串转换为的类型作为模板参数。同样,ToString模板函数执行相反的操作。
您可以轻松想象使用插入和提取运算符的实现。
1 2 3 4
| int i = std::FromString <int> (std::string ("2"))
int j = std::FromString <int> ("2")
std::string = ToString <double> (3.14159) |
是的,当然,函数名没有大写字母,可能是from_string和to_string。
模板专门化是可能的。
最后,确实没有任何限制,类型必须是本机类型,对吗?
-
真的。它"不回答问题"。但是创建两个模板是如此简单,以至于我实际上认为生成的代码库将更易读,更易于使用。 (是的,我已经编写了它们。它们实际上是模板函数中的简单练习。不幸的是,由于我将它们编写为工作产品的一部分,因此我可能不会在此处复制代码。)
-
我不是在争论他们的用处。 Boost已经有lexical_cast了。我只是说你的答案不属于这里。也许它属于您的博客,或者是在回答一个要求转换类型的第三种方法的问题的答案时出现,而不是为了比较另一个两个答案而该答案完全忽略的问题。