stl vector自定义类型的去重问题

最近项目遇到一个问题,有关stl vector自定义类型的去重问题。

背景:1、在一个vector中,存在大量元素拥有同一属性,而其他属性我们不关心,为了减少数据包大小,需要去重

   2、此自定义类型不能去重载==操作符(公司代码规范等原因)

   3、正常情况下,vector中对象是有序的(拥有同一属性的元素排在一起)          
     /*引起误解,后补充*/

于是,花了十分钟撸出了下列代码原型。


 1 #include <iostream>
2 #include <vector>
3 #include <algorithm>
4
5 using namespace std;
6
7 struct test
8 {
9 int key;
10 int value;
11 };
12
13 class finder
14 {
15 public:
16 explicit finder(test _t):t(_t){}
17 const bool operator()(test __t)const{return t.key==__t.key;}
18 private:
19 test t;
20 };
21
22 int main(void)
23 {
24 vector<test> vTest;
25 test t1 = {1,10};
26 test t2 = {1,11};
27 test t3 = {2,8};
28 test t4 = {2,9};
29 test t5 = {1,6};
30 vTest.push_back(t1);
31 vTest.push_back(t2);
32 vTest.push_back(t3);
33 vTest.push_back(t4);
34 vTest.push_back(t5);
35
36 for(int index=0; index!=vTest.size(); ++index)
37 {
38 vTest.erase(find_if(vTest.begin(),vTest.end(),finder(vTest[index])));
39 if(index == vTest.size())
40 break;
41 }
42
43 for(int index=0; index!=vTest.size(); ++index)
44 cout<<vTest[index].key<<‘\t‘<<vTest[index].value<<endl;
45
46 return 0;
47 }

结果:

这里利用了一下仿函数(functor)来构造find_if的条件,达到查找具有相同属性的自定义类型对象。

if里的判断是为了防止segment fault,erase在删除最后一个元素的时候,会给你带来惊喜-_-(详情请查看stl吧)。

目的达到了,但是总感觉循环太浪费CPU太低效太罪恶了,各位看官有没有更好的办法呢?求解。

时间: 2024-08-03 22:10:31

stl vector自定义类型的去重问题的相关文章

C++ STL vector容器学习

STL(Standard Template Library)标准模板库是C++最重要的组成部分,它提供了一组表示容器.迭代器.函数对象和算法的模板.其中容器是存储类型相同的数据的结构(如vector,list, deque, set, map等),算法完成特定任务,迭代器用来遍历容器对象,扮演容器和算法之间的胶合剂. 模板类vector 在计算中,矢量(vector)对应数组,它的数据安排以及操作方式,与array非常类似.在C++中,使用vector模板类时,需要头文件包含#include<v

stl vector 类

目录 [-]说明构造方法例子vector 类中定义了4中种构造函数: · 默认构造函数,构造一个初始长度为0的空向量,如:vector<int> v1; · 带有单个整形参数的构造函数,此参数描述了向量的初始大小. 说明 vector是一种动态数组,是基本数组的类模板.其内部定义了很多基本操作. #include <vector> 注意:头文件没有“.h”构造: 这个构造函数还有一个可选的参数,这是一个类型为T的实例,描述了各个向量种各成员的初始值: 如:vector<int

STL Vector容器

STL Vector容器 Vector容器简介 vector是将元素置于一个动态数组中加以管理的容器.        vector可以随机存取元素(支持索引值直接存取, 用[]操作符或at()方法,这个等下会详讲).         vector尾部添加或移除元素非常快速.但是在中部或头部插入元素或移除元素比较费时        头文件:#include<vector> vector对象的默认构造 vector采用模板类实现, vector对象的默认构造形式: vector<T>

STL vector用法介绍

介绍 这篇文章的目的是为了介绍std::vector,如何恰当地使用它们的成员函数等操作.本文中还讨论了条件函数和函数指针在迭代算法中使用,如在remove_if()和for_each()中的使用.通过阅读这篇文章读者应该能够有效地使用vector容器,而且应该不会再去使用C类型的动态数组了.   Vector总览 vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库.vector之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象

STL vector的N种构造方式

1 使用默认无参的构造函数进行构造 vector<int> intVect; 观察内存可以看到生成一个带有0个元素的vector时内存中_Myfirst _Mylast _Myend的值均为0,说明vector对象并没有在堆中分配任何存储空间,仅仅是在栈中分配了16字节存储vecotr对象元素,在这16字节中前4字节如果没猜错,应该是一个虚表指针. Vecotr模版类有三个成员变量 _Myfirst  记录在堆分配数组的首地址 _Mylast  记录在堆中分配数组中最后一个有效数据的下一字节地

STL ——vector 学习

STL简介 C++ STL (Standard Template Library标准模板库) 是通用类模板和算法的集合,它提供给程序员一些标准的数据结构的实现如 queues(队列), lists(链表), 和 stacks(栈)等.  C++ STL 提供给程序员以下三类数据结构的实现: 标准容器类   顺序性容器  vector 从后面快速的插入与删除,直接访问任何元素  deque 从前面或后面快速的插入与删除,直接访问任何元素 list 双链表,从任何地方快速插入与删除   关联容器  

STL vector的介绍(1)

尝试下翻译STL里面的一些容易和算法.四级过了,六级刚考.顺便练练自己的英语水平,翻译的不好的地方请大神多多指教哈,方便我改正. 原来均来自:http://www.cplusplus.com/ template < class T, class Alloc = allocator<T> > class vector; // generic template Vector Vectors are sequence containers representing arrays that

C++ stl vector介绍

转自: STL vector用法介绍 介绍 这篇文章的目的是为了介绍std::vector,如何恰当地使用它们的成员函数等操作.本文中还讨论了条件函数和函数指针在迭代算法中使用,如在remove_if()和for_each()中的使用.通过阅读这篇文章读者应该能够有效地使用vector容器,而且应该不会再去使用C类型的动态数组了.   Vector总览 vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库.vector之所以被认为是一个容器,是

STL vector

author:Donald-hu    theme:STL vector 介绍 这篇文章的目的是为了介绍std::vector,如何恰当地使用它们的成员函数等操作.本文中还讨论了条件函数和函数指针在迭代算法中使用,如在remove_if()和for_each()中的使用.通过阅读这篇文章读者应该能够有效地使用vector容器,而且应该不会再去使用C类型的动态数组了.   Vector总览 vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库.v