diff --git a/cosets/src/tc.cpp b/cosets/src/tc.cpp index 12ca511..28eb419 100644 --- a/cosets/src/tc.cpp +++ b/cosets/src/tc.cpp @@ -52,34 +52,35 @@ struct Table { } std::vector> words() { - std::vector *> vecs(size()); - vecs[0] = new std::vector(); + std::vector> vecs(size()); + std::vector done_vecs(size()); + done_vecs[0] = true; + + bool done = false; + while (!done) { + done = true; - while (std::find(vecs.begin(), vecs.end(), nullptr) != vecs.end()) { for (int from = 0; from < (int) vecs.size(); ++from) { - std::vector *word = vecs[from]; - if (word == nullptr) { + if (done_vecs[from]) { + done = false; continue; } + std::vector word = vecs[from]; for (int gen = 0; gen < (int) N; ++gen) { int to = get(from, gen); - if (vecs[to] != nullptr) { + if (done_vecs[to]) { continue; } - vecs[to] = new std::vector(*word); - vecs[to]->push_back(gen); + done_vecs[to] = true; + vecs[to].assign(word.size() + 1, gen); + std::copy(word.begin(), word.end(), vecs[to].begin()); } } } - std::vector> res(size()); - for (int i = 0; i < (int) size(); ++i) { - res[i] = *vecs[i]; - } - - return res; + return vecs; } };