免责声明:链接是cppreference.comstd :: strtol和std :: stoi之间有什么区别?
所以我已经知道了,而std::atoi已被弃用,它被推荐使用std::strtol代替。
C++ 11引入了std::stoi,我试图理解为什么要选择使用它,而不是std::strtol
。
从我的理解是,stoi调用strtol但抛出异常。它也返回一个整数而不是一个长整数。
这些是主要的区别,我错过了什么?
免责声明:链接是cppreference.comstd :: strtol和std :: stoi之间有什么区别?
所以我已经知道了,而std::atoi已被弃用,它被推荐使用std::strtol代替。
C++ 11引入了std::stoi,我试图理解为什么要选择使用它,而不是std::strtol
。
从我的理解是,stoi调用strtol但抛出异常。它也返回一个整数而不是一个长整数。
这些是主要的区别,我错过了什么?
这些是主要的区别,我错过了什么?
较新,std::stoi
也适用直接从std::string
(这样你就不必用垃圾电话.c_str()
代码)和可选为您提供的第一未匹配字符作为指数通过size_t
,而不是一个指针。
这些更改简化了代码中的使用。
一个大区别是,stoi
需要一个std::string
作为它的参数,所以你不必钉.c_str()
到串上,将其转换为整数。
如果你想转换为long
,你可以使用stol
代替(同样地,stod
,stof
stold
,stoul
,stoll
转换为double,
float
,long double
,unsigned long
和long long
分别)。
如果您想通过std::basic_string
并且您想要退出int
,您将使用std::stoi()
。如果您想要出去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。
当然,模板专业化是可能的。 最后,真的没有限制,类型必须是本地类型,对吗?
-1。不回答这个问题。 –
是的。它“不回答这个问题”。但是创建这两个模板非常简单,我实际上认为生成的代码库会更易读易用。 (是的,我写了它们,它们是模板函数中的简单练习,不幸的是,因为我将它们作为工作产品的一部分编写,所以我可能不会在这里重现这些代码。) –
我不认为它们有用。无论如何,Boost已经有'lexical_cast'。我只是说你的答案不属于这里。也许它属于你的博客,或者是回答一个问题,要求提供第三种转换类型的方法,而不是将这个答案完全忽略的其他两种方法进行比较。 –
我比strtol()更喜欢stoi(),因为前者会在无效输入中抛出std :: invalid_argument。要破坏GNU中的异常消息,libstdC++不会有帮助。例如:“what():stoi”
可能重复的[为什么没有std :: stou?](http://stackoverflow.com/questions/8715213/why-is-there-no-stdstou) –
@KerrekSB这真的是一个无关的问题... –
@KerrekSB我的问题是更好地理解为什么要使用stoi,如果最终它只是调用strtol。 – jmstoker