diff options
| author | Maxime Coste <frrrwww@gmail.com> | 2012-12-13 18:45:32 +0100 |
|---|---|---|
| committer | Maxime Coste <frrrwww@gmail.com> | 2012-12-13 18:50:27 +0100 |
| commit | 8e170e4385e51d06a9b6083ded0880e56146f9a3 (patch) | |
| tree | 206b48505ec51b81eecb714593c648cf319b65f7 /src/editor.cc | |
| parent | 3aee1c37fb7345da33d0ed84e7f4b8b83de7dab2 (diff) | |
optimize merge_overlappings
assume selections are sorted, so we have a linear complexity algorithm
instead of O(n²).
Diffstat (limited to 'src/editor.cc')
| -rw-r--r-- | src/editor.cc | 18 |
1 files changed, 9 insertions, 9 deletions
diff --git a/src/editor.cc b/src/editor.cc index d41ffe5f..02baf5f5 100644 --- a/src/editor.cc +++ b/src/editor.cc @@ -121,18 +121,18 @@ std::vector<String> Editor::selections_content() const static void merge_overlapping(SelectionList& selections) { - for (size_t i = 0; i < selections.size(); ++i) + assert(std::is_sorted(selections.begin(), selections.end(), + [](const Selection& lhs, const Selection& rhs) + { return lhs.begin() < rhs.begin(); })); + for (size_t i = 0; i < selections.size()-1;) { - for (size_t j = i+1; j < selections.size();) + if (overlaps(selections[i], selections[i+1])) { - if (overlaps(selections[i], selections[j])) - { - selections[i].merge_with(selections[j]); - selections.erase(selections.begin() + j); - } - else - ++j; + selections[i].merge_with(selections[i+1]); + selections.erase(selections.begin() + i + 1); } + else + ++i; } } |
