创建没有重复的数组

时间:2013-11-03 14:37:56

标签: c++ arrays algorithm duplicates

我的问题如下。如何使用const char *中使用的所有字符创建一个数组,使得数组没有任何重复。例如:

const char *pass = "Qqqqqqqwwwww11111" 

应该创建一个

数组
Q  |  q  |  w  |  1

用户给出了变量传递,因此很难确定它的外观。

3 个答案:

答案 0 :(得分:2)

许多解决方案之一包括使用std::sortstd::unique。使用std::string(或std::vector,...)更安全更安全。

#include <iostream>
#include <algorithm>

int main() {
    char *pass = "Qqqqqqqwwwww11111"; // or by user input

    // using std::string is easier and safer (works similarly with std::vector)
    std::string data(pass);

    // Remove duplicates with std::sort and std::unique
    std::sort(data.begin(), data.end());
    auto end = std::unique(data.begin(), data.end());

    // Remove duplicates – if needed.
    data.erase(end, data.end());

    // Print the unique chars
    std::cout << data << std::endl;
    return 0;
}

根据您正在做的事情,您可能不需要erase data的重复元素。在这种情况下,请记住end是第一个重复元素上的​​迭代器(或者,如果数据首先没有重复,则它等于data.end())。

注意:在使用std::unique之前,您绝对需要对数据进行排序。

Here you can try this code

答案 1 :(得分:1)

根据我的理解,您想要删除所有重复项,订单是不可取的,因此std::unique是不够的。

虽然您的元素类型很小,例如char - 您可以使用array / std::vector / std::bitset来记住以前遇到的元素:

Live Demo

template<typename I, typename O>
I remove_duplicates(I first, I last, O out)
{
    using T = typename iterator_traits<I>::value_type;
    using limits = numeric_limits<T>;

    constexpr auto min = limits::lowest();
    constexpr auto max = limits::max();

    bitset<size_t(max - min) + 1> had_before;

    while(first != last)
    {
        T x = *first;
        size_t i = x - min;
        if(!had_before[i])
        {
            had_before.set(i);
            *out = x;
            ++out;
        }
        ++first;
    }
    return out;
}

int main()
{
    char s[] = "Qqqqqqqwwwww111qq1q1Qa";
    auto first = begin(s), last = end(s);
    auto new_last = remove_duplicates(first, last, first);
    for_each(first, new_last, [](char x) { cout << x; });
}

输出是:

Qqw1a

答案 2 :(得分:1)

如果您要创建一个没有相邻重复元素的数组,那么首先您应该计算字符串传递中有多少个唯一元素,然后为该数组动态分配内存并复制其中的唯一元素。 可以使用标准算法简单地完成任务。例如

char *a = 0;

size_t n = std::strlen( pass );

if ( n != 0 )
{
    size_t count = 1 + std::inner_product( pass + 1, pass + n, pass, 0u, 
                                           std::plus<size_t>(),
                                           std::not_equal_to<const char>() );

    a = new char[count + 1];

    std::unique_copy( pass, pass + n + 1, a );
}

或许编写

会更简单
char *a = 0;

size_t n = 1 + std::strlen( pass );

size_t count = 1 + std::inner_product( pass + 1, pass + n, pass, 0u, 
                                       std::plus<size_t>(),
                                       std::not_equal_to<const char>() );

a = new char[count];

std::unique_copy( pass, pass + n, a );