例如:
char s[]="abcde";
for(int i=0;i<strlen(s);i++)
cout<<s+i<<endl;
输出:
abcde
bcde
cde
de
e
这不会破坏 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';
更像 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
分配内存,但我认为这里的好处是清晰(使用专门为您尝试做的事情命名和设计的函数) ,并避免原始指针(通常是初学者混淆的原因)都超过了这里的性能(非)问题。
一种更现代的方法是使用 std::experimental::string_view
,它结合了使用为你想要的东西而设计的特定 C++ 组件的清晰度,同时避免了额外的分配。 ,旨在包装现有的字符串:
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
做你可能期望的事情:按指定的数字缩小它在前面包装的字符串的 View 。
string_view
在技术上还不是标准的一部分,所以我真的不推荐将它用于生产,因为你不会得到良好的跨平台支持。但是学习起来很有趣。您可能会考虑非常相似(并非巧合)的组件 boost::string_ref
成为生产质量。
此外,请重新考虑您对通常被认为是不良做法的使用:using namespace std;
和 endl
(这些是解释的链接)。
关于c++ - 显示从索引 i 到字符串末尾的 std::string,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35888035/