C ++在向量中找到重复的符号

时间:2018-07-07 08:26:01

标签: c++ histogram std

我如何确切地找到std::vector中有多少个重复符号?

想法是编写以下程序-输入一系列符号(应为字母),例如:

aaaabbbccccc

当然,这是一个字符串,然后将其写入vector中(好吧,我想如果您将其写入vector,则迭代会容易得多)

输出为:4a3b5c(关于四个a,三个b和五个c

我的主要问题是找到重复的符号并对其进行操作。

2 个答案:

答案 0 :(得分:2)

您可以在迭代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

答案 1 :(得分:2)

这是实现同一目标的另一种方法。由于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';
}