我的问题如下。如何使用const char *中使用的所有字符创建一个数组,使得数组没有任何重复。例如:
const char *pass = "Qqqqqqqwwwww11111"
应该创建一个
数组Q | q | w | 1
用户给出了变量传递,因此很难确定它的外观。
答案 0 :(得分:2)
许多解决方案之一包括使用std::sort
和std::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
之前,您绝对需要对数据进行排序。
答案 1 :(得分:1)
根据我的理解,您想要删除所有重复项,订单是不可取的,因此std::unique
是不够的。
虽然您的元素类型很小,例如char
- 您可以使用array
/ std::vector
/ std::bitset
来记住以前遇到的元素:
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 );