В этом посте мы обсудим, как перебирать символы строки в C++.
1. Наивное решение
Идея состоит в том, чтобы перебирать символы std::string
используя простой цикл for и печатая каждый символ по текущему индексу, используя []
оператор.
1 2 3 4 5 6 |
void print(const std::string &s) { for (std::string::size_тип i = 0; i < s.size(); i++) { std::cout << s[i] << ' '; } } |
результат:
h e l l o
2. Использование цикла for на основе диапазона
Рекомендуемый подход в C++11 и более поздних версиях заключается в переборе символов std::string
с использованием цикла for на основе диапазона.
1 2 3 4 5 6 |
void print(const std::string &s) { for (char const &c: s) { std::cout << c << ' '; } } |
результат:
h e l l o
3. Использование итераторов
Мы также можем перебирать символы std::string
с помощью итераторов. Поскольку итерация доступна только для чтения, мы можем использовать std::string::const_iterator
вернулся std::string::cbegin
а также std::string::cend
.
1 2 3 4 5 6 |
void print(const std::string &s) { for (auto it = s.cbegin() ; it != s.cend(); ++it) { std::cout << *it << ' '; } } |
результат:
h e l l o
4. Использование std::for_each
функция
Мы можем даже уменьшить сложность, используя std::for_each
Алгоритм STL, который применяет указанную функцию к каждому элементу входного диапазона.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
#include <iostream> #include <algorithm> void fn(char const &c) { std::cout << c << ' '; } void print(const std::string &s) { std::for_each(s.begin(), s.end(), fn); } int main() { std::string s("hello"); print(s); return 0; } |
результат:
h e l l o
Мы даже можем заменить вызов функции лямбда-выражениями в C++11. Лямбда — это удобный способ определения встроенного анонимного функтора в том месте, где он передается в качестве аргумента некоторой функции.
1 2 3 4 5 6 |
void print(const std::string &s) { std::for_each(s.begin(), s.end(), [] (char const &c) { std::cout << c << ' '; }); } |
результат:
h e l l o
5. Перегрузка operator<<
Наконец, мы также можем перегрузить operator<<
за std::string
объекты, как показано ниже:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
#include <iostream> #include <iterator> std::ostream &operator<< (std::ostream &os, const std::string &s) { for (char const &c: s) { os << c << ' '; } return os; } int main() { std::string s("hello"); std::cout << s; return 0; } |
результат:
h e l l o
Это все, что касается перебора символов строки в C++.