Дешевые и неприятный путь, ближе всего к тому, что у вас уже есть: использовать std::string::c_str()
std::string const s{"abcde"};
char const *c = s.c_str();
for (std::size_t i=0; i<s.size(); ++i)
std::cout << c+i << '\n';
Чем больше string
-как путь заключается в использовании std::string::substr
:
std::string const s{"abcde"};
for (std::size_t i=0; i<s.size(); ++i)
std::cout << s.substr(i) << '\n';
Обратите внимание, что второй подход делает включать каждый раз выделяя память для нового string
, но я думаю, что здесь преимущество ясности (с использованием функции, специально названной и предназначенной для того, что вы пытаетесь сделать), и избегая необработанных указателей (часто ac ause путаницы для новичков), и перевешивают производительность (не) проблему здесь.
Более современный подход, который сочетает в себе четкость с использованием специфических C компонентов ++, предназначенные для того, что вы хотите, с избежать дополнительных ассигнований, является использование std::experimental::string_view
, который предназначен, чтобы обернуть существующую строку символов:
std::string const s{"abcde"};
std::experimental::string_view sv{s};
for (std::size_t i=0; i<s.size(); ++i) {
std::cout << sv << '\n';
sv.remove_prefix(1);
}
std::experimental::string_view::remove_prefix
делает то, что вы ожидаете: сжимает вид строки, которую она обертывает спереди, по указанному номеру.
string_view
пока не является технически частью Стандарта, поэтому я не рекомендую его для использования в производстве, так как вы не получите хорошей кросс-платформенной поддержки. Но это довольно интересно узнать. Вы можете рассмотреть очень похожий (не случайно) компонент, boost::string_ref
- качество продукции.
Кроме того, пожалуйста, пересмотрите свое использование того, что часто считается плохой практики: using namespace std;
и endl
(те ссылки на объяснения).
use 'std :: string :: substr' –
Вы все равно можете использовать' std :: string :: c_str() + i'. – Jarod42
Никогда не используйте вызов 'strlen' как условие в цикле во время итерации по строке. Вы выполняете дополнительную работу, она делает сложность _O (n^2) _ вместо _O (n) _. – alexolut