C++语法基础之STL集合类

本文介绍了C++中的STL集合类,包括set和multiset,它们基于二叉树实现,支持快速查找和排序。set不允许元素重复,而multiset允许。插入、查找和删除操作在两者中都有详细说明。此外,还提到了unordered_set和unordered_multiset,它们使用散列函数确定排序,与set和multiset的主要区别在于内部实现和查找效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

set 和 multiset

头文件:< set >
内部使用类似二叉树的方式实现,不能够替换或者直接修改指定位置的元素,但是能够对元素进行排序并实现快速查找建。

  • 实例化
    默认谓词:std::less,实现升序排列
    实例化一个升序排列的set或者multiset(也可以直接greater< type >)
// used as a template parameter in set / multiset instantiation
template <typename T>
struct SortDescending{
bool operator()(const T& lhs, const T& rhs) const{
	return (lhs > rhs);
	}
};

set <int, SortDescending<int>> setInts;
multiset <int, SortDescending<int>> msetInts;

此外,还可以直接使用其他set、multiset、vector、list或者其他STL容器初始化

  • 插入
    使用成员函数insert()
    参数是要插入的值或者指定范围
setInts.insert (-1);
msetInts.insert (setInts.begin (), setInts.end ());

可以使用multiset::count(value),确定包含多少个这样的元素

  • 查找
    find(),返回迭代器,与end()进行比较
    在multiset中,函数查找第一个与给定键匹配的元素,相同值的元素在相邻位置存储,所有可以通过加减迭代器count()-1次找到所有指定值的元素。

  • 删除
    clear(),可以清空内容
    erase()重载版本

setObject.erase (key);
setObject.erase (element);//element为迭代器
setObject.erase (iLowerBound, iUpperBound);

在multiset中,使用第一个版本,会删除所有值为key的元素,若想只清除一个元素使用迭代器版本

将对象存储在set或者multiset中,需要实现运算符< 和 ==,前者是排序谓词后者将用于find()等函数
示例:

struct ContactItem{
string name;
string phoneNum;
string displayAs;

// used by set::find() given contact list item
bool operator == (const ContactItem& itemToCompare) const
{
return (itemToCompare.name == this->name);
}

// used to sort
bool operator < (const ContactItem& itemToCompare) const
{
return (this->name < itemToCompare.name);
}

// Used in DisplayContents via cout
operator const char*() const
{
	return displayAs.c_str();
}
};
unordered_set 和 unordered_multiset

头文件< unordered_set>,包含一个确定排序顺序的散列函数
常用方法和set 与 multiset基本相同

包含max_bucket_count()、load_factor()、max_load_factor()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值