我有一个结构向量 {key; 值},按键排序:
{ {0, 1}, {0, 2}, {1, 1}, {1, 2}, {1, 3}, {2, 1}, {2, 2} }
我需要用相同的键擦除除最后一个元素之外的所有元素。结果应该是:
{ {0, 2}, {1, 3}, {2, 2} }
最简洁的方法是什么?我可以使用哪些 STL 算法?显然,这个任务不适合 remove-erase 习惯用法。
一个简单但有效的解决方案是遍历向量,将相关元素复制到一个新向量中。
另一种方法是使用std::unique
(带有适当的谓词)。由于您想保留每个组中的最后一个元素,您需要使用反向迭代器。
我的话,需要的算法是:
在代码中:
#include <vector>
#include <iostream>
#include <algorithm>
struct S { int key; int value; };
int main() {
std::vector<S> vec{ {0, 1}, {0, 2}, {1, 1}, {1, 2}, {1, 3}, {2, 1}, {2, 2} };
auto lastKey = std::numeric_limits<int>::max();
auto rLast = std::remove_if(vec.rbegin(), vec.rend(), [&lastKey](S const& s) -> bool {
if (s.key == lastKey) return true;
lastKey = s.key;
return false;
});
vec.erase(begin(vec),rLast.base());
for (auto& s : vec) {
std::cout << '{' << s.key << ',' << s.value << '}';
}
}
或std::unique
按照其他答案中的建议使用:
auto rLast = std::unique(vec.rbegin(), vec.rend() [](S const& s1, S const& s2) {
return s1.key == s2.key;
});
vec.erase(vec.begin(), rLast.base());
如果你使用一个std::map
问题就消失了:
std::map<int, int> theMap;
// insert the elements of { {0, 1}, {0, 2}, {1, 1}, {1, 2}, {1, 3}, {2, 1}, {2, 2} }
theMap[0] = 1;
theMap[0] = 2;
theMap[1] = 1;
theMap[1] = 2;
theMap[1] = 3;
theMap[2] = 1;
theMap[2] = 2;
// result: { {0, 2}, {1, 3}, {2, 2} }