1

我有一个结构向量 {key; 值},按键排序:

{ {0, 1}, {0, 2}, {1, 1}, {1, 2}, {1, 3}, {2, 1}, {2, 2} }

我需要用相同的键擦除除最后一个元素之外的所有元素。结果应该是:

{ {0, 2}, {1, 3}, {2, 2} }

最简洁的方法是什么?我可以使用哪些 STL 算法?显然,这个任务不适合 remove-erase 习惯用法。

4

3 回答 3

8

一个简单但有效的解决方案是遍历向量,将相关元素复制到一个新向量中。

另一种方法是使用std::unique(带有适当的谓词)。由于您想保留每个组中的最后一个元素,您需要使用反向迭代器。

于 2013-06-28T06:15:14.657 回答
3

我的话,需要的算法是:

  • 向后迭代容器
  • 如果您使用新键,请留下元素,
  • 如果您使用已有的密钥,请删除该元素。

在代码中:

#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());
于 2013-06-28T07:30:11.237 回答
1

如果你使用一个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} }
于 2013-06-28T07:55:13.243 回答