例如:
char s[]="abcde";
for(int i=0;i<strlen(s);i++)
cout<<s+i<<endl;
输出:
abcde
bcde
cde
de
e
这并没有破坏char数组。
我想要求帮助的是,我们可以通过std::string
课程采用另一种方式吗?
答案 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
(这些是解释的链接)。