Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.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++ 尝试使用解引用迭代器连接字符串时,无法在字符串向量中连接字符串_C++_C++11_Stl_Iterator - Fatal编程技术网

C++ 尝试使用解引用迭代器连接字符串时,无法在字符串向量中连接字符串

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

我的目的是得到一个向量,其中包含给定字符串的所有子字符串。我试图通过将当前字符串与向量中的迭代字符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 (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
是type
int
,而
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 << ' ';
    }
}