对std::vector<make_pair>中重复元素的删除
2011-11-23 22:06
471 查看
方法1:
vector删除重复元素
主要思路为,先排序,再唯一,然后删除最后面的那段重复代码。
举例:有这样一个vector
int a[10] = {1,3,6,4,7,2,3,4,8,9}; // 1,2,3,3,4,4,6,7,8,9
vector<int> ivec(a, a+10);
①首先将vector排序
sort( vecSrc.begin(), vecSrc.end() ); // 1,2,3,3,4,4,6,7,8,9
②然后使用unique算法,unique返回值是重复元素的开始位置。
vector<int>::iter pos;
pos = unique(ivec.begin, ivec.end()); //1,2,3,4,6,7,8,9,3,4
// ^
③最后删除后面的那段重复部分
earse(pos, ivec.end()); //1,2,3,4,6,7,8,9
如果vector中存储的元素是自定义的结构或者是类,那么就需要重载操作符。根据类的某一个成员变量排序或者比较。
sort算法需要重载"<"操作符。unique算法需要重载"=="操作符。
操作符重载的示例如下:
class CTest
……
public:
BOOL operator<( const CTest& oCompany ) const
{
return this->m_nCompanyId < oCompany.m_nCompanyId;
}
BOOL operator==( const CECompany& oCompany ) const
{
return this->m_nCompanyId == oCompany.m_nCompanyId;
}
}
以上部分为转载http://blog.csdn.net/nowen/article/details/5509525的一部分。
----------------------------------------------------------------------------------------------------------------------------分割线
以下最重要的部分来了:
其实就是几句话:
使用map效果会简单的多,因为std::map 本身就是一一对应的,如果说有重复的部分,将这些元素放进去之后就自动将重复元素过滤了。
具体代码实现:
已知:std::vector<make_pair<string,string>> vec_pair;
——————————————————————————————
std::vector<make_pair>::iterator iter = vec_pair.begin();
std::map<string,string> map_str;
for(;iter = vec_pair.end();iter++)
{
string str1 = iter.first();
if(map_str[str]]==Null)
{
map_str.insert(std::make_pair(iter .first(),iter .second()));
}
}
___________________________________________________
接下来map_str里面的元素就没有重复的了,完成!
vector删除重复元素
主要思路为,先排序,再唯一,然后删除最后面的那段重复代码。
举例:有这样一个vector
int a[10] = {1,3,6,4,7,2,3,4,8,9}; // 1,2,3,3,4,4,6,7,8,9
vector<int> ivec(a, a+10);
①首先将vector排序
sort( vecSrc.begin(), vecSrc.end() ); // 1,2,3,3,4,4,6,7,8,9
②然后使用unique算法,unique返回值是重复元素的开始位置。
vector<int>::iter pos;
pos = unique(ivec.begin, ivec.end()); //1,2,3,4,6,7,8,9,3,4
// ^
③最后删除后面的那段重复部分
earse(pos, ivec.end()); //1,2,3,4,6,7,8,9
如果vector中存储的元素是自定义的结构或者是类,那么就需要重载操作符。根据类的某一个成员变量排序或者比较。
sort算法需要重载"<"操作符。unique算法需要重载"=="操作符。
操作符重载的示例如下:
class CTest
……
public:
BOOL operator<( const CTest& oCompany ) const
{
return this->m_nCompanyId < oCompany.m_nCompanyId;
}
BOOL operator==( const CECompany& oCompany ) const
{
return this->m_nCompanyId == oCompany.m_nCompanyId;
}
}
以上部分为转载http://blog.csdn.net/nowen/article/details/5509525的一部分。
----------------------------------------------------------------------------------------------------------------------------分割线
以下最重要的部分来了:
其实就是几句话:
使用map效果会简单的多,因为std::map 本身就是一一对应的,如果说有重复的部分,将这些元素放进去之后就自动将重复元素过滤了。
具体代码实现:
已知:std::vector<make_pair<string,string>> vec_pair;
——————————————————————————————
std::vector<make_pair>::iterator iter = vec_pair.begin();
std::map<string,string> map_str;
for(;iter = vec_pair.end();iter++)
{
string str1 = iter.first();
if(map_str[str]]==Null)
{
map_str.insert(std::make_pair(iter .first(),iter .second()));
}
}
___________________________________________________
接下来map_str里面的元素就没有重复的了,完成!
相关文章推荐
- std::vector删除重复元素和查找
- typedef std::vector<Byte> ByteVector
- 实战c++中的vector系列--使用sort算法对vector进行排序(对vector<string>排序、使用稳定的排序std::stable_sort())
- C++ std::pair<>
- std::vector删除重复元素和查找
- error LNK2005: “public: class std::vector<class std::vector<class std::vector<float>”
- 解决:error : 元素 <EnableEnhancedInstructionSet> 具有无效值“AdvancedVectorExtensions”。
- 【C++ Primer】【练习题】【3.13】【3.17】求vector<int>相邻元素的和
- 【C++ Primer】【练习题】【3.14】将vector<string>对象各元素中的小写字母转换成大写字母
- 用迭代器求vector<double>中元素的和,for语句写循环
- 使用::std::vector<>作为管理动态数组的优先选择
- QVector<QString> 显示器里面的动态数组元素QString和char *转变
- 用迭代器求vector<double>中元素的和,while语句写循环
- CF 346 B vector<pair> s[100]
- 不能将参数 1 从“int”转换为“std::_Vector_const_iterator<_Myvec>”(VS2010 )
- convert 'std::vector<>::iterator {aka __gnu_cxx::__normal_iterator<*, std::vector<> >}' to '*' in in
- QVector<QString> 显示动态数组里面的元素用QString和char *的转换
- C++ 使用::std::vector<>
- std::vector删除重复元素和查找
- 去除Warning C4251 “class 'std::vector<_Ty>' needs to have dll-interface to be used by clients of class