Вопрос:
Как точно узнать, сколько повторяющихся символов у меня есть в std::vector?
Идея состоит в том, чтобы написать следующую программу. Вы вводите последовательность символов (должна быть буквами), например:
aaaabbbccccc
Это, конечно, строка, которая затем записывается в vector (ну, я думаю, если вы напишете его в vector, это будет намного проще для итераций)
И выход: 4a3b5c (как есть четыре a, три b и пять c)
Моя основная проблема заключается в поиске повторяющихся символов и выполнении операций с ними.
Лучший ответ:
Вот еще один способ добиться того же. Это, вероятно, немного более эффективно, чем решение на основе std::map из-за того, что std::array является непрерывным в памяти и поддерживает произвольные контейнеры ввода и вывода через итераторы.
Можно использовать массив, потому что мы можем иметь только 256 отдельных символов.
#include <array> #include <vector> #include <iostream> #include <type_traits> #include <utility> #include <limits> template < typename InputIter, typename OutputIter, typename = typename std::enable_if_t< std::is_same_v< typename std::iterator_traits<InputIter>::value_type, char>>> OutputIter encode(InputIter begin, InputIter end, OutputIter out) { constexpr auto num_chars = std::numeric_limits<char>::max(); std::array<int, num_chars> counts = {}; while (begin != end) ++counts[*begin++]; for (char i = 0; i < num_chars; ++i) if (counts[i] > 0) *out++ = std::make_pair(i, counts[i]); return out; } int main() { std::vector<char> v = { ‘a’, ‘a’, ‘a’, ‘a’, ‘b’, ‘b’, ‘b’, ‘c’, ‘c’, ‘c’, ‘c’, ‘c’}; std::vector<std::pair<char, int>> out; encode(v.begin(), v.end(), std::back_inserter(out)); for (auto e : out) std::cout << e.second << e.first; std::cout << ‘n’; } Ответ №1
Вы можете использовать std::map для хранения числа символов при повторении std::vector и использовать элементы std::vector в качестве ключей для std::map:
#include <vector> #include <iostream> #include <map> int main() { std::vector<char> vec{‘a’, ‘a’, ‘a’, ‘a’, ‘b’, ‘b’, ‘b’, ‘c’, ‘c’, ‘c’, ‘c’, ‘c’}; std::map<char, int> cnt; // count symbols for (auto elem: vec) cnt[elem]++; // display count for (auto elem: cnt) std::cout << elem.second << elem.first; std::cout << std::endl; }
Выполнение приведенного выше кода даст результат 4a3b5c.