vector<int> nums = {1, 2, 2, 3, 4, 4, 5}; auto it = unique(nums.begin(), nums.end()); 这样之后vector是什么样的
时间: 2024-03-28 16:41:48 浏览: 48
经过 `unique()` 函数去重后,`nums` 中的元素变成了 `{1, 2, 3, 4, 5, 4, 5}`,其中最后两个元素是被移动到了 `nums` 的末尾位置,而返回值 `it` 指向了去重后的末尾位置,即指向了 `nums` 中的数字 5。需要注意的是,`unique()` 函数只会将重复的元素移到容器的末尾,并不会真正删除这些元素,因此实际上 `nums` 中还是包含了重复的元素。
如果想要真正删除重复的元素,需要使用 `erase()` 函数,将 `it` 与 `nums.end()` 之间的元素删除,代码如下:
```cpp
nums.erase(it, nums.end());
```
执行上述代码之后,`nums` 中的元素变成了 `{1, 2, 3, 4, 5}`,重复的元素被成功地删除了。
相关问题
#include <iostream> #include <algorithm> #include <vector> using namespace std; int main() { int n; cin >> n; vector<int> nums(n); for (int i = 0; i < n; i++) { cin >> nums[i]; } sort(nums.begin(), nums.end()); // 排序 auto it = unique(nums.begin(), nums.end()); // 去重 nums.resize(distance(nums.begin(), it)); for (int i = 0; i < nums.size(); i++) { cout << nums[i] << " "; } cout << endl; return 0; }
这段代码在上一段代码的基础上,使用了 unique() 函数进行去重,并使用 resize() 函数缩小容器的大小,去除重复元素。最后,使用 for 循环遍历 nums 容器中的元素,并输出每个元素的值。
具体来说,代码中使用了 auto 关键字定义了一个迭代器 it,表示去重后的容器中最后一个元素的下一个位置。unique() 函数的参数为容器的起始和结束地址,即 nums.begin() 和 nums.end(),表示对整个容器进行去重。去重后,使用 distance() 函数计算新的逻辑结尾位置与容器起始位置之间的距离,并将容器的大小缩小到该距离,从而去除重复元素。
最后,使用 for 循环遍历 nums 容器中的元素,并输出每个元素的值。由于容器中已经没有重复元素,因此直接输出即可。
class Solution { public: bool canReorderDoubled(vector<int> &arr) { unordered_map<int, int> cnt; for (int x : arr) { ++cnt[x]; } if (cnt[0] % 2) { return false; } vector<int> vals; vals.reserve(cnt.size()); for (auto &[x, _] : cnt) { vals.push_back(x); } sort(vals.begin(), vals.end(), [](int a, int b) { return abs(a) < abs(b); }); for (int x : vals) { if (cnt[2 * x] < cnt[x]) { // 无法找到足够的 2x 与 x 配对 return false; } cnt[2 * x] -= cnt[x]; } return true; } };
A) {
unordered_map<int, int> freq; // to store frequency of each number
for(int num : A) freq[num]++;
vector<int> nums; // to store unique numbers in ascending order
for(auto p : freq) nums.push_back(p.first);
sort(nums.begin(), nums.end());
for(int num : nums) {
if(freq[num] == 0) continue; // if current number is already processed, skip it
int doubleNum = num * 2; // find the double of current number
if(doubleNum == 0) { // if current number is 0, it can only be paired with itself
if(freq[num] % 2 != 0) return false; // if frequency of current number is odd, return false
freq[num] = 0; // mark current number as processed
continue;
}
if(freq[num] > freq[doubleNum]) return false; // if frequency of current number is greater than frequency of its double, return false
freq[doubleNum] -= freq[num]; // subtract frequency of current number from frequency of its double
freq[num] = 0; // mark current number as processed
}
return true; // if all numbers are processed successfully, return true
}
};
阅读全文