例如:
char s[]="abcde";
for(int i=0;i<strlen(s);i++)
cout<<s+i<<endl;
Run Code Online (Sandbox Code Playgroud)
输出:
abcde
bcde
cde
de
e
Run Code Online (Sandbox Code Playgroud)
这不会破坏char数组.
我想要求帮助的是,我们可以通过另一种方式在std::string课堂上做到这一点吗?
廉价和讨厌的方式,最接近你已经拥有的:使用 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';
Run Code Online (Sandbox Code Playgroud)
更像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';
Run Code Online (Sandbox Code Playgroud)
请注意,第二种方法确实涉及为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);
}
Run Code Online (Sandbox Code Playgroud)
std::experimental::string_view::remove_prefix 做你可能期望的事情:通过指定的数字缩小它在前面包裹的字符串的视图.
string_view从技术上讲,它不是标准的一部分,因此我不建议将其用于生产用途,因为您无法获得良好的跨平台支持.但要了解这一点非常有趣.您可能会认为非常相似(非巧合)的组件boost::string_ref是生产质量.
另外,请重新考虑你的东西通常被认为是不好的做法,使用:using namespace std;和endl(那些链接的解释).