为了提高性能,我尝试std::string用自定义专业化来替代,std::basic_string其中我用自定义分配器替换标准分配器。有一件事让我感到惊讶:std::stoi函数类需要不断引用std::string(或std::wstring) 作为输入,因此这些函数不能与其他专业化一起使用。但从逻辑上讲,这些函数不应该关心内存是如何分配的;所以他们的签名看起来过于限制。
虽然我可以使用std::from_chars从任何类似字符串的数据中读取整数,但我仍然想知道是否有这样设计的原因std::stoi,以及是否还有其他设计用于与std::basic_string模板一起使用的 STL 函数。
我刚刚发现(令我惊讶的是)以下输入不会导致std::stoi抛出异常:
3.14
3.14helloworld
Run Code Online (Sandbox Code Playgroud)
违反了最小惊喜原则 - 因为这些都不是有效的格式整数值。
请注意,也许更令人惊讶的3.8是转换为值3。
std::stoi当输入确实不是有效整数时,是否有更严格的版本会抛出异常?还是我必须自己动手?
顺便问一下,为什么C++标准库要std::stoi这样实现呢?该函数唯一的实际用途是拼命尝试从随机垃圾输入中获取一些整数值 - 这似乎不是一个非常有用的函数。
这是我的解决方法。
static int convertToInt(const std::string& value)
{
std::size_t index;
int converted_value{std::stoi(value, &index)};
if(index != value.size())
{
throw std::runtime_error("Bad format input");
}
return converted_value;
}
Run Code Online (Sandbox Code Playgroud)