Давайте начнем с того, что ИМХО, std::string
является своего рода дизайном класса с хромой строкой или, по крайней мере, определенно показывает его возраст несколькими способами.
- Что такое
size_t
и когда мы должны использовать это точно?
Это равно std::size_t
(в C ++ это , а не просто size_t
). Но давайте не будем говорить о том, когда именно, когда вы должны его использовать, потому что ...
Почему мы использовали size_t
здесь?
Я бы сказал, что мы не должны иметь. Мы должны были либо написать
auto position = s1.find(wordFind);
(как вы на самом деле предложили, но с auto
для обозначения автоматического вывода типа c), либо, если мы хотим быть явным, то:
std::string::size_type position = s1.find(wordFind);
Потому что это то, что find()
возвращает. Часто бывает , чтобы быть std::size_t
, но: (a) Возможно, нет, я даже не уверен (спасибо @Ayxan); (б) вас не должно волновать, обычно это std::size_t
или нет.
Но даже вышеприведенные варианты не верны. Здесь есть более глубокая проблема - и проблема в том, что find()
должен действительно возвращать [std::optional][2]<std::string::size_type>
. За исключением того, что в C ++ до недавнего времени не было необязательного типа, так что строковый класс как бы его настраивал. Ошибка при поиске подстроки возвращает значение, выделенное как недопустимое: std::string::npos
(имеет тип std::string::size_type
). Так что, возможно, то, что мы должны написали:
auto to_optional = [](std::string::size_type pos_or_npos) {
return pos_or_npos == std::string::npos ?
std::nullopt :
std::optional<std::string::size_type>{pos_or_npos};
};
auto position = to_optional(s1.find(wordFind));
Что больше похоже на то, что мы на самом деле имеем в виду: либо вы получили какую-то позицию, либо нет.
Что такое позиция? (Я имею в виду, она составлена или является частью C ++?)
См. Мой последний абзац.
Означает ли условие if поиск слова до конца строки?
Нет, find()
уже ищет до конца. С нашей переделкой if()
будет выглядеть так:
if (position.has_value())
// ... etc etc
else
// ... etc etc