cpp利用位图操作去除重复数字并且保留原顺序
时间: 2024-10-21 14:01:50 浏览: 17
用VS2015实现任意bmp格式的图片的读操作并显示出来
在C++中,如果需要从一组数字中去除重复项并保持原顺序,可以借助位图(Bitset)数据结构。Bitset允许我们以位的形式存储大量的布尔值,非常适合用于查找和删除重复元素,因为它提供了一种高效的空间利用方式。
以下是一个简单的步骤:
1. 首先,创建一个 Bitset 对象,大小等于输入数组的最大可能数值加一。这将确保所有的位都有空间表示。
```cpp
bitset<MAX_VALUE> bitmap(MAX_VALUE + 1);
```
这里的 MAX_VALUE 应该替换为实际的数组最大值。
2. 然后遍历输入数组,对于每个元素,检查对应的位是否已经设置。如果没有,就将其设置为 1 表示存在,并继续下一个元素。
```cpp
for (int num : input_array) {
if (!bitmap[num]) {
bitmap[num] = true;
}
}
```
3. 接下来,我们可以从原始数组中复制不重复的元素到另一个数组或迭代器,只读取那些在 Bitmap 中对应的位为 1 的位置。
```cpp
std::vector<int> unique_numbers(input_array.size());
size_t index = 0;
for (size_t i = 0; i < bitmap.size(); ++i) {
if (bitmap[i]) {
unique_numbers[index++] = static_cast<int>(i);
}
}
```
4. 最后得到的 `unique_numbers` 就是没有重复数字且按原顺序排列的数组。
注意:这种方法适合小范围的整数数组,因为位图可能会占用大量内存,特别是当最大值非常大时。对于大规模的数据集,更常见的做法可能是使用哈希集合(如标准库中的 unordered_set)或排序+双指针技巧等算法。
阅读全文