- set/multiset 通常以红黑树(red-black tree)实现。红黑树在改变元素数量和元素搜索方面都很出色,它保证节点安插时最多只会做两个重新链接(relink)的动作,而且到达某一元素的最长路径的深度,至多只是最短路径的深度的两倍。
创建 set 容器对象时,指定排序规则(sorting criterion)
set (模板容器类)的第二个模板参数标识:排序规则(一般为仿函数)
class Person
{
public:
std::string firstname() const;
std::string lastname() const;
...
}
class PersonSortingCriterion
{
public:
bool operator()(const Person& left, const Person& right) const
{
return left.lastname() < right.lastname() ||
(left.lastname() == right.lastname() && left.firstname() < right.firstname());
}
};
int main(int, char**)
{
std::set<Person, PersonSortingCriterion> coll;
...
return 0;
}
常见成员函数
(1)插入(insert)
set 提供如下接口:
pair<iterator, bool> insert(const value_type& val); iterator insert(const_iterator posHint, const value_type& val); // 注意两者返回值的区别
- pair 结构的 second 成员表示安插是否成功
- pair 结构的 first 成员表示新元素的位置,或现存的同值元素的位置。
std::set<double> s; if (s.insert(3.3).second) { ... } else { ... }
如果还想处理新位置或旧位置,此时就需要有保存 insert() 的返回值了:
auto status = s.insert(value); if (status.second) std::cout << value << " inserted as element "; else std::cout << value << " already exists as element "; std::cout << std::distance(s.begin(), status.first)+1 << std::endl;