显示从索引i到字符串末尾的std :: string

时间:2016-03-09 09:47:12

标签: c++ string char

例如:

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

输出:

abcde
bcde
cde
de
e

这并没有破坏char数组。

我想要求帮助的是,我们可以通过std::string课程采用另一种方式吗?

1 个答案:

答案 0 :(得分:6)

廉价且讨厌的方式,与您已有的方式最接近:使用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';

使用std::string::substr的方式越string

std::string const s{"abcde"};
for (std::size_t i=0; i<s.size(); ++i)
    std::cout << s.substr(i) << '\n';

请注意,第二种方法确实涉及每次为新string分配内存,但我认为这里有清晰的好处(使用专门为您要做的事情命名和设计的功能),并避免原始指针(通常是初学者混淆的原因)都超过了这里的性能(非)问题。

一种更现代的方法,结合使用为所需设计的特定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(这些是解释的链接)。