本文转自:http://www.cnblogs.com/yongqiang/p/5746754.html
set容器内的元素会被自动排序,set与map不同,set中的元素即是键值又是实值,set不允许两个元素有相同的键值。不能通过set的迭代器去修改set元素,原因是修改元素会破坏set组织。当对容器中的元素进行插入或者删除时,操作之前的所有迭代器在操作之后依然有效。
multiset特性及用法和set完全相同,唯一的差别在于它允许键值重复。
set和multiset的底层实现是一种高效的平衡二叉树,即红黑树(Red-Black Tree)。
以下代码涉及的内容:
1、set容器中,元素类型为基本类型,如何让set按照用户意愿来排序?
2、set容器中,如何让元素类型为自定义类型?
3、set容器的insert函数的返回值为什么类型?
#include <iostream>
#include <string>
#include <set>
using namespace std;
/* 仿函数CompareSet,在test02使用 */
class CompareSet
{
public:
//从大到小排序
bool operator()(int v1, int v2)
{
return v1 > v2;
}
//从小到大排序
//bool operator()(int v1, int v2)
//{
// return v1 < v2;
//}
};
/* Person类,用于test03 */
class Person
{
friend ostream &operator<<(ostream &out, const Person &person);
public:
Person(string name, int age)
{
mName = name;
mAge = age;
}
public:
string mName;
int mAge;
};
ostream &operator<<(ostream &out, const Person &person)
{
out << "name:" << person.mName << " age:" << person.mAge << endl;
return out;
}
/* 仿函数ComparePerson,用于test03 */
class ComparePerson
{
public:
//名字大的在前面,如果名字相同,年龄大的排前面
bool operator()(const Person &p1, const Person &p2)
{
if (p1.mName == p2.mName)
{
return p1.mAge > p2.mAge;
}
return p1.mName > p2.mName;
}
};
/* 打印set类型的函数模板 */
template<typename T>
void PrintSet(T &s)
{
for (T::iterator iter = s.begin(); iter != s.end(); ++iter)
cout << *iter << " ";
cout << endl;
}
void test01()
{
//set容器默认从小到大排序
set<int> s;
s.insert(10);
s.insert(20);
s.insert(30);
//输出set
PrintSet(s);
//结果为:10 20 30
/* set的insert函数返回值为一个对组(pair)。
对组的第一个值first为set类型的迭代器:
1、若插入成功,迭代器指向该元素。
2、若插入失败,迭代器指向之前已经存在的元素
对组的第二个值seconde为bool类型:
1、若插入成功,bool值为true
2、若插入失败,bool值为false
*/
pair<set<int>::iterator, bool> ret = s.insert(40);
if (true == ret.second)
cout << *ret.first << " 插入成功" << endl;
else
cout << *ret.first << " 插入失败" << endl;
}
void test02()
{
/* 如果想让set容器从大到小排序,需要给set容
器提供一个仿函数,本例的仿函数为CompareSet
*/
set<int, CompareSet> s;
s.insert(10);
s.insert(20);
s.insert(30);
//打印set
PrintSet(s);
//结果为:30,20,10
}
void test03()
{
/* set元素类型为Person,当set元素类型为自定义类型的时候
必须给set提供一个仿函数,用于比较自定义类型的大小,
否则无法通过编译
*/
set<Person,ComparePerson> s;
s.insert(Person("John", 22));
s.insert(Person("Peter", 25));
s.insert(Person("Marry", 18));
s.insert(Person("Peter", 36));
//打印set
PrintSet(s);
}
int main(void)
{
//test01();
//test02();
//test03();
return 0;
}
使用set容器需要注意的细节
以下代码涉及的内容:
1、multiset容器的insert函数返回值为什么?
#include <iostream>
#include <set>
using namespace std;
/* 打印set类型的函数模板 */
template<typename T>
void PrintSet(T &s)
{
for (T::iterator iter = s.begin(); iter != s.end(); ++iter)
cout << *iter << " ";
cout << endl;
}
void test(void)
{
multiset<int> s;
s.insert(10);
s.insert(20);
s.insert(30);
//打印multiset
PrintSet(s);
/* multiset的insert函数返回值为multiset类型的迭代器,
指向新插入的元素。multiset允许插入相同的值,因此
插入一定成功,因此不需要返回bool类型。
*/
multiset<int>::iterator iter = s.insert(10);
cout << *iter << endl;
}
int main(void)
{
test();
return 0;
}
使用multiset容器需要注意的细节
**set构造函数
函数 功能**
- set st set默认构造函数
- mulitset mst multiset默认构造函数
- set(const set &st) 拷贝构造函数
**set赋值操作
函数 功能**
- set& operator=(const set &st) 重载等号操作符
- swap(st) 交换两个集合容器
**set大小操作
函数 功能**
- size() 返回容器中元素的数目
empty() 判断容器收为空
**set插入和删除操作
函数 功能**insert(elem) 在容器中插入元素
- clear() 清除所有元素
- erase(pos)删除pos迭代器所指的元素,返回下一个元素的迭代器
- erase(beg, end) 删除区间[beg,end)的所有元素 ,返回下一个元素的迭代器
- erase(elem) 删除容器中值为elem的元素
**set查找操作
函数 功能**
- find(key) 查找键key是否存在,若存在,返回该键的元素的迭代器;若不存在, 返回set.end()
- count(key) 查找键key的元素个数
- lower_bound(keyElem) 返回最后一个key<=keyElem元素的迭代器
- upper_bound(keyElem) 返回第一个key>keyElem元素的迭代器
- equal_range(keyElem) 返回容器中key与keyElem相等的上下限的两个迭代器,这两个迭代器被放在对组(pair)中

本文详细介绍了C++ STL中的set与multiset容器的使用方法与注意事项,包括元素排序方式、自定义类型作为元素的方法、插入删除操作的返回值类型及容器迭代器的有效性等问题。
8321

被折叠的 条评论
为什么被折叠?



