C++ 显示从索引i到字符串末尾的std::字符串
例如:C++ 显示从索引i到字符串末尾的std::字符串,c++,string,char,C++,String,Char,例如: char s[]="abcde"; for(int i=0;i<strlen(s);i++) cout<<s+i<<endl; 这不会破坏char数组 我想寻求帮助的是,我们是否有其他方法可以使用std::string类来实现这一点?便宜而恶劣的方法,最接近您已经拥有的方法:使用 请注意,第二种方法确实涉及每次为新的字符串分配内存,但我认为在这里,清晰性的好处(使用专门命名和设计的函数)和避免原始指针(通常是初学者混淆的原因)都
char s[]="abcde";
for(int i=0;i<strlen(s);i++)
cout<<s+i<<endl;
这不会破坏char数组
我想寻求帮助的是,我们是否有其他方法可以使用
std::string
类来实现这一点?便宜而恶劣的方法,最接近您已经拥有的方法:使用
请注意,第二种方法确实涉及每次为新的字符串
分配内存,但我认为在这里,清晰性的好处(使用专门命名和设计的函数)和避免原始指针(通常是初学者混淆的原因)都超过了性能(非-)问题在这里
一种更为现代的方法,它结合了使用特定的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::string const s{“abcde”};
std::experimental::string_view sv{s};
对于(std::size\u t i=0;iusestd::string::substr
您仍然可以使用std::string::c_str()+i
。在对字符串进行迭代时,切勿将调用strlen
作为循环中的条件。如果您做了额外的工作,则会使复杂性变成O(n^2)而不是O(n)@alexolute:永远不要使用相同的调用strlen
。Microsoft有时使用一种模式,其中字符串列表表示为一个连续字符数组,列表以空字符串结尾。您需要的循环是for(char*s=begin;strlen(s);s+=strlen(s)+1)
这显然是O(n*m),因为您有O(n)长度为O(m)的字符串。@msalter不够清晰,因为在迭代中调用了两次strlen
。
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 const s{"abcde"};
for (std::size_t i=0; i<s.size(); ++i)
std::cout << s.substr(i) << '\n';
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);
}