Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 显示从索引i到字符串末尾的std::字符串_C++_String_Char - Fatal编程技术网

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;iuse
std::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);
}