尝试使用dereferenced iterator

时间:2018-04-09 06:16:26

标签: 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 (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
    }
}

3 个答案:

答案 0 :(得分:2)

vec.push_back invalidates existing iterators。您可能希望更改算法以避免这种情况,例如:

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';
}

答案 1 :(得分:1)

以下是按长度减少的顺序列出子串的方法。

#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 << ' ';
}

大声说出来:

  

foobar的   foob​​a   oobar   foob   OOBA   OBAR   FOO   OOB   奥巴   酒吧   FO   OO   OB   BA   AR   F   Ø   Ø   b   一个   [R

即将推出您附近的编译器...... 没有矢量,没有std ::字符串,没有复制!

#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 << ' ';
    }
}

答案 2 :(得分:0)

使用size()而不是迭代器

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; 
    }
}