我的问题如下。如何使用 const char * 中使用的所有字符创建一个数组,以使数组没有任何重复。例如:
const char *pass = "Qqqqqqqwwwww11111"
应该创建一个数组
Q | q | w | 1
可变通行证由用户给出,因此很难确定它的外观。
我的问题如下。如何使用 const char * 中使用的所有字符创建一个数组,以使数组没有任何重复。例如:
const char *pass = "Qqqqqqqwwwww11111"
应该创建一个数组
Q | q | w | 1
可变通行证由用户给出,因此很难确定它的外观。
许多解决方案之一在于使用std::sort
and 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
.
据我了解,您想删除所有重复项并且顺序很重要,因此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
如果您的意思是创建一个没有相邻重复元素的数组,那么首先您应该计算字符串传递中有多少个唯一元素,然后为数组动态分配内存并复制其中的唯一元素。该任务可以使用标准算法简单地完成。例如
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 );