2013-10-08 212 views
4

免责声明:链接是cppreference.comstd :: strtol和std :: stoi之间有什么区别?

所以我已经知道了,而std::atoi已被弃用,它被推荐使用std::strtol代替。

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

从我的理解是,stoi调用strtol但抛出异常。它也返回一个整数而不是一个长整数。

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

+0

可能重复的[为什么没有std :: stou?](http://stackoverflow.com/questions/8715213/why-is-there-no-stdstou) –

+0

@KerrekSB这真的是一个无关的问题... –

+0

@KerrekSB我的问题是更好地理解为什么要使用stoi,如果最终它只是调用strtol。 – jmstoker

回答

7

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

较新,std::stoi也适用直接从std::string(这样你就不必用垃圾电话.c_str()代码)和可选为您提供的第一未匹配字符作为指数通过size_t,而不是一个指针。

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

+0

因此,可以安全地假设stoi提供了便利,但由于内部转换将字符串转换并返回int,所以会牺牲一些开销。 – jmstoker

+0

@jmstoker尽管如此,我怀疑你不会得到太多开销,因为如果你使用'std :: string'作为输入,你将不得不做相同的转换。 –

+0

对,我只是想知道是否有更多的事情发生在stoi上,就像提供例外的逻辑一样。我可能在分析它,但它让我很感兴趣。 – jmstoker

2

一个大区别是,stoi需要一个std::string作为它的参数,所以你不必钉.c_str()到串上,将其转换为整数。

如果你想转换为long,你可以使用stol代替(同样地,stodstofstoldstoulstoll转换为double,floatlong doubleunsigned longlong long分别)。

2

如果您想通过std::basic_string并且您想要退出int,您将使用std::stoi()。如果您想要出去long,您可以拨打std::stol()

0

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

-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。

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

+0

-1。不回答这个问题。 –

+0

是的。它“不回答这个问题”。但是创建这两个模板非常简单,我实际上认为生成的代码库会更易读易用。 (是的,我写了它们,它们是模板函数中的简单练习,不幸的是,因为我将它们作为工作产品的一部分编写,所以我可能不会在这里重现这些代码。) –

+2

我不认为它们有用。无论如何,Boost已经有'lexical_cast'。我只是说你的答案不属于这里。也许它属于你的博客,或者是回答一个问题,要求提供第三种转换类型的方法,而不是将这个答案完全忽略的其他两种方法进行比较。 –

1

我比strtol()更喜欢stoi(),因为前者会在无效输入中抛出std :: invalid_argument。要破坏GNU中的异常消息,libstdC++不会有帮助。例如:“what():stoi”

相关问题