C++ 尝试使用解引用迭代器连接字符串时,无法在字符串向量中连接字符串
我的目的是得到一个向量,其中包含给定字符串的所有子字符串。我试图通过将当前字符串与向量中的迭代字符str 下面的代码中出现了什么错误C++ 尝试使用解引用迭代器连接字符串时,无法在字符串向量中连接字符串,c++,c++11,stl,iterator,C++,C++11,Stl,Iterator,我的目的是得到一个向量,其中包含给定字符串的所有子字符串。我试图通过将当前字符串与向量中的迭代字符str 下面的代码中出现了什么错误 void Substring(string str) { vector<string> vec={""}; for(auto i =0; i<str.length(); i++) { auto end = vec.end(); string s(1,str[i]); for
void Substring(string str)
{
vector<string> vec={""};
for(auto i =0; i<str.length(); i++)
{
auto end = vec.end();
string s(1,str[i]);
for (auto iter = vec.begin(); iter!=end; iter++)
{
vec.push_back(s+ static_cast<string>(*iter)); // --> what is the problem here in concatenation
}
}
for (auto iter = vec.begin(); iter!=vec.end(); iter++)
{
cout <<"iter_val:"<<*iter <<endl; //--> does not print concated element
}
}
void子字符串(字符串str)
{
向量向量={'};
对于(auto i=0;i),串联中的问题是什么
}
}
对于(自动iter=vec.begin();iter!=vec.end();iter++)
{
cout。您可能希望更改算法以避免这种情况,例如:
std::vector<std::string> substrings(std::string const& s) {
std::vector<std::string> result;
for(size_t i = 0, j = s.size(); i < j; ++i)
for(size_t k = 1, l = j - i - !i; k <= l; ++k)
result.push_back(s.substr(i, k));
return result;
}
int main() {
for(auto const& s : substrings("abc"))
std::cout << s << '\n';
}
std::vector子字符串(std::string const&s){
std::向量结果;
对于(size_t i=0,j=s.size();i
void Substring(string str)
{
vector<string> vec={""};
for(auto i =0; i<str.length(); i++)
{
auto size = vec.size();
string s(1,str[i]);
for (auto iter = 0; iter<size; iter++)
{
vec.push_back(vec[iter]+s);
}
}
for (auto iter = vec.begin(); iter!=vec.end(); iter++)
{
cout <<"iter_val:"<<*iter <<endl;
}
}
void子字符串(字符串str)
{
向量向量={'};
对于(auto i=0;i,这里有一个按长度递减的顺序列出子字符串
#include <vector>
#include <string>
static
std::vector<std::string>
substrings(const std::string &str) {
std::vector<std::string> subs;
const auto m = str.length();
for (size_t N = m; N > 0; --N) {
for (size_t i = 0; i <= m-N; ++i) {
subs.push_back(str.substr(i, N));
}
}
return subs;
}
int main() {
for(const auto &s : substrings("foobar"))
std::cout << s << ' ';
}
#包括
#包括
静止的
向量
子字符串(常量std::string和str){
std::向量子;
const auto m=str.length();
对于(大小N=m;N>0;--N){
对于(size\u t i=0;i您的预期输出和输入str格式是什么?如果向量的存储被重新分配(这在您推回时可能会非常频繁)然后所有迭代器都将失效。请注意:*iter
已经是一个std::string
,您不需要强制转换它。@codekaizer:我只想将str的子字符串转换为vector并显示它。对于一个可能的解决方案,请改用大小,并使用索引进行迭代。如果您共享,这会很有帮助,如何推回使迭代器无效。我对我得到的输出感到非常困惑。它是未定义的输出吗?我的代码提供了?输出->我发现它每次都与“”但是保持迭代的次数,否则我会期望无限迭代。起初我认为有一个bug,因为它不在子串中打印字符串本身。然后,我看到了,而不是bug,特征。@通过设计使它无效迭代器。读。好,但是我不考虑构造如<代码> L= J-I-!I < /代码>。作为“好的可维护代码”;@JHBonarius一个好的设计不是当没有什么可添加的时候,而是当没有什么可删除的时候。不要使用。也不要忽略编译器警告:i
是typeint
,而str.length()< /代码>返回<代码> SIZEXT 类型,因此比较它们将返回警告。您还确定要考虑一个空字符串吗?
#include <generator>
#include <string_view>
std::generator<std::string_view>
substrings(std::string_view const s) {
const auto m = s.length();
for (size_t N = m; N > 0; --N) {
for (size_t i = 0; i <= m-N; ++i) {
co_yield s.substr(i, N);
}
}
}
int main() {
for (auto const s : substrings("foobar")) {
std::cout << s << ' ';
}
}