我的意图是拥有一个包含给定字符串的所有子字符串的向量。我试图通过使用 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
}
}
答案 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的 fooba 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;
}
}