我在my posts中提到了一个关于boost::lexical_cast
替代方案的问题,在许多回复中,我有一个建议stoi
作为可行的替代方案。
我决定对它进行测试,令我惊讶的是,这个函数的第二个参数(描述大小的参数)是指向size_t
类型的指针,而不是实际的size_t
类型。有没有任何合理的解释,以什么方式最好有一个指向实际对象的指针而不是对象本身(只是在这种特殊情况下,当涉及大小而我不会本能地用指针分配大小)?
链接到stoi doc:http://msdn.microsoft.com/en-us/library/ee404860.aspx
答案 0 :(得分:4)
这是一种拥有可选参数的方法。基本上,如果您有兴趣知道哪个是未转换为数字的第一个字符。如果您对该结果不是很感兴趣,可以传递nullptr。
§21.5[string.conversions] / 1 [...]如果函数没有抛出异常且idx!= 0,则函数在* idx中存储str的第一个未转换元素的索引。
这意味着用作:
int main() {
std::string two{"2 and more contents"};
// I don't care, just want a number:
int i = std::stoi( two, 0, 10 ); // base = 0
std::size_t first_not_converted;
int i = std::stoi( two, &first_not_converted, 10 );
std::cout << "Unconverted string is: " << two.substr( first_not_converted ) << std::endl;
}
通过使用指针,您可以使参数真正可选,如果它是out参数,但需要使用引用,但这需要用户代码创建变量始终而不管他们是否对价值感兴趣,所以它不是真正的选择。
答案 1 :(得分:2)
我认为size_t *参数是一个指向变量的指针,stoi在转换后的数字结束后将字符串放置在字符串中。即它是一个'out'参数,因此是一个指针。
例如:http://msdn.microsoft.com/en-us/library/ee404860.aspx
也许您应该指出令人困惑的特定文档。