c++ 如何在读取重复值时删除它们?

0aydgbwb  于 2023-06-25  发布在  其他
关注(0)|答案(2)|浏览(152)

MRE(因为许可证问题):

  1. std::set<std::string> pool;
  2. // values: 10 10 1 3 4 3 3 2 5 7 5 4 3 9 8 8 7
  3. // (values is an iterable collection)
  4. for (const auto& value : values) {
  5. pool.insert(value);
  6. }
  7. // expected read: 10 1 3 4 2 5 7 9 8
  8. // actual read: 1 10 2 3 4 5 7 8 9 (10 after 1 because std::string)

我用什么样的集合来实现这个目标?

tmb3ates

tmb3ates1#

使用2个容器。读入集合,使用insert的返回值来判断这个项是否是新的。然后只向vector中添加新项。该向量将是插入顺序中的唯一项。

  1. #include <vector>
  2. #include <set>
  3. #include <string>
  4. #include <iostream>
  5. int main()
  6. {
  7. std::vector<std::set<std::string>::iterator> itemsInOrder;
  8. std::set<std::string> pool;
  9. std::vector<std::string> values = {"10", "10", "1", "3"};
  10. for (const auto& value : values)
  11. {
  12. auto ret = pool.insert(value);
  13. if (ret.second)
  14. {
  15. itemsInOrder.push_back(ret.first);
  16. }
  17. }
  18. for (auto item : itemsInOrder)
  19. {
  20. std::cout << *item << std::endl;
  21. }
  22. }
展开查看全部
tyg4sfes

tyg4sfes2#

“pool.insert”返回一个pair,pair.second是插入元素的bool类型

  1. #include<iostream>
  2. #include<set>
  3. #include<vector>
  4. using namespace std;
  5. int main(void) {
  6. set<int> pool;
  7. pair<set<int>::iterator, bool> k;
  8. vector<int> v={10, 10, 1, 3, 6, 3, 3, 2, 5, 7, 5, 6, 3, 9, 8, 8, 7};
  9. vector<int> result;
  10. // values: 10 10 1 3 6 3 3 2 5 7 5 6 3 9 8 8 7
  11. // (values is an iterable collection)
  12. for(int i = 0; i < v.size(); i++) {
  13. k = pool.insert(v[i]);
  14. if(k.second==true) {
  15. result.push_back(v[i]);
  16. }
  17. }
  18. // expected read: 10 1 3 6 2 5 7 9 8
  19. // actual read: 10 1 3 6 2 5 7 9 8
  20. int i = 0;
  21. return 0;
  22. }
展开查看全部

相关问题