vector<int>::iterator unique(vector<int>& a) { for (int i = 0, j = 0; i < a.size(); i++) { if (!i || a[i] != a[i - 1]) a[j++] = a[i]; // 将不重复的元素放在前j个数 } return a.begin() + 1; }
时间: 2024-04-19 22:30:32 浏览: 52
这段代码是一个去重的函数,它接受一个整数向量 a,并返回一个指向去重后的向量的迭代器。
函数使用了一个双指针的方法。变量 i 和 j 分别表示当前遍历的元素和去重后的向量的索引。开始时,i 和 j 都初始化为 0。
函数从头开始遍历向量 a,对于每个元素 a[i],检查它是否与前一个元素 a[i-1] 相同。如果不相同,说明 a[i] 是一个不重复的元素,将其放在去重后的向量的前 j 个数中,并将 j 自增。如果相同,则说明 a[i] 重复,不做处理。
最后,函数返回一个迭代器,指向去重后的向量的第一个元素(注意加上偏移量 1,因为题目要求返回的是去重后的向量的迭代器)。
需要注意的是,这段代码假设向量 a 已经按升序排列。如果向量 a 无序,需要先进行排序操作。
相关问题
int main() { vector<Animal*> vec; vec.push_back(new Animal("tiger", 1.2, 250, 5)); vec.push_back(new Animal("lion", 1.0, 200, 6)); vec.push_back(new Animal("elephant", 2.5, 5000, 25)); vec.push_back(new Animal("giraffe", 5.5, 800, 12)); sort(vec.begin(), vec.end(), compareWeight); for (vector<Animal*>::iterator iter = vec.begin(); iter != vec.end(); ++iter) { cout << (*iter)->getName() << ": " << (*iter)->getWeight() << endl; } cout << "The heaviest animal: " << vec.back()->getName() << endl; for (vector<Animal*>::iterator iter = vec.begin(); iter != vec.end(); ++iter) { delete *iter; } return 0; } 这段代码不用指针应该怎么写呢?
可以使用智能指针 `std::unique_ptr` 来替代原先的裸指针,避免手动管理内存。修改后的代码如下所示:
```
int main() {
vector<std::unique_ptr<Animal>> vec;
vec.push_back(std::make_unique<Animal>("tiger", 1.2, 250, 5));
vec.push_back(std::make_unique<Animal>("lion", 1.0, 200, 6));
vec.push_back(std::make_unique<Animal>("elephant", 2.5, 5000, 25));
vec.push_back(std::make_unique<Animal>("giraffe", 5.5, 800, 12));
sort(vec.begin(), vec.end(), compareWeight);
for (auto& animal : vec) {
cout << animal->getName() << ": " << animal->getWeight() << endl;
}
cout << "The heaviest animal: " << vec.back()->getName() << endl;
return 0;
}
```
值得注意的是,在使用 `std::unique_ptr` 时,我们需要使用 `std::make_unique` 来分配内存。此外,由于智能指针会自动管理内存,我们不再需要手动删除指针,因此删除指针的那个循环可以省略。
#include<iostream> #include<vector> using namespace std; int main () { vector <int> v; v.push_back(9); v.push_back(3); v.push_back(9); int len = unique(0,v.size())-v; return 0; }
这段代码中有一些错误。第一个问题是,unique函数的第一个参数应该是迭代器而不是数字0,可以改为使用v.begin()。第二个问题是,unique函数返回的是去重后的尾迭代器,需要再减去v.begin()才能得到去重后的元素个数。正确的代码如下:
```c++
#include <iostream>
#include <vector>
using namespace std;
int main () {
vector<int> v;
v.push_back(9);
v.push_back(3);
v.push_back(9);
vector<int>::iterator it = unique(v.begin(), v.end());
int len = it - v.begin();
return 0;
}
```
注意到这段代码只去重了相邻的重复元素,如果需要完全去重需要先排序再去重。
阅读全文