2016-03-09 3 views
3

Например:Отображение зЬй :: строки из индекса я до конца строки

char s[]="abcde"; 
    for(int i=0;i<strlen(s);i++) 
      cout<<s+i<<endl; 

Выход:

abcde 
bcde 
cde 
de 
e 

И это не испортит массив символов.

Что я хочу попросить о помощи, есть ли другой способ, который мы можем сделать с классом std::string?

+4

use 'std :: string :: substr' –

+3

Вы все равно можете использовать' std :: string :: c_str() + i'. – Jarod42

+3

Никогда не используйте вызов 'strlen' как условие в цикле во время итерации по строке. Вы выполняете дополнительную работу, она делает сложность _O (n^2) _ вместо _O (n) _. – alexolut

ответ

7

Дешевые и неприятный путь, ближе всего к тому, что у вас уже есть: использовать 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 (те ссылки на объяснения).

Смежные вопросы