Подтвердить что ты не робот

В чем разница между std:: atoi() и std:: stoi?

В чем разница между atoi и stoi?

Я знаю,

std::string my_string = "123456789";

Чтобы преобразовать эту строку в целое число, вам нужно сделать следующее:

const char* my_c_string = my_string.c_str(); 
int my_integer = atoi(my_c_string);

С++ 11 предлагает сжатую замену:

std::string my_string = "123456789"; 
int my_integer = std::stoi(my_string);

1). Существуют ли другие различия между ними?

2). Эффективность и производительность, какая из них лучше?

3). Что безопаснее использовать?

4b9b3361

Ответ 1

1). Существуют ли другие различия между ними?

Я нахожу std::atoi() ужасную функцию: он возвращает нуль при ошибке. Если вы считаете нуль как действительный ввод, то вы не можете определить, была ли ошибка во время преобразования или вход был равен нулю. Это просто плохо. См. Например Как узнать, не сработала ли функция c atoi или была ли она нулей?

С другой стороны, соответствующая функция С++ генерирует исключение при ошибке. Вы можете правильно отличать ошибки от нуля в качестве входных данных.

2). Эффективность и производительность, какая из них лучше?

Если вам не нужна правильность или вы точно знаете, что у вас не будет нуля в качестве входных данных, или вы все равно считаете ошибку, возможно, функции C могут быть быстрее (вероятно, из-за отсутствия исключения обработка). Это зависит от вашего компилятора, стандартной реализации библиотеки, вашего оборудования, вашего ввода и т.д. Лучший способ - измерить его. Однако я подозреваю, что разница, если таковая имеется, незначительна.

Если вам нужна быстрая (но уродливая C-стиль) реализация, наиболее ответный ответ на Как разобрать строка в int в С++? вопрос кажется разумным. Тем не менее, я бы не пошел с этой реализацией, если не был абсолютно необходим (в основном из-за необходимости связываться с завершением char* и \0).

3). Что безопаснее использовать?

См. первую точку.

В дополнение к этому, если вам нужно работать с char* и следить за завершением \0, вы больше похожи на ошибки; std::string намного проще и безопаснее работать, поскольку он позаботится обо всех этих вещах.