STL — set容器的使用详解
set容器的使用详解
其实map和set是一个爸爸 - 红黑树爸爸,只不过set力气不够,不像map那么可以拥有一个主键(key)和实键(value).它只有一个键值并且
set当中不能存储相同的键值(set还具有强迫症). 其实map和set的区别差不多就完了. 他们的相同点,他们底层都是使用红黑树构造的
这使得他们的查找,插入,删除的效率都非常的高. 并且他们都是有序的,这些都非常关键! 这是一个好的容器的标准.当然set的禁忌
也和map一样,set不能存储无法比较大小的数据. 因为构建红黑树需要比较大小. 而且在set中存储相同的键值 ,新的就会覆盖久的.
set的特性是,所有元素都会根据元素的键值自动被排序. 我们可以通过set的迭代器改变set的元素值吗? 不行,因为set元素值就是其键
值,关系到set元素的排列规则,如果任意改变set元素值,会严重破坏set组织. set的源代码之中看到,set
tree的const_iterator,杜绝写入操作. 换句话说,set iterator是一种constant iterator(相对于mutable iterator).
set拥有与list相同的某些性质: 当客户端对它进行元素新增操作或删除操作时,操作之前的所有迭代器,在操作完成之后都依然有效,当然
那个被删除元素迭代器必然是个例外.
set相关函数
#
begin | 返回一个迭代器,此迭代器指向set中的第一个元素。 |
cbegin | 返回一个常量迭代器,此迭代器指向set中的第一个元素。 |
cend | 返回一个迭代器,此迭代器指向set最后一个元素的下一个位置 |
clear | 清除set的所有元素。 |
crbegin | 返回一个常量迭代器,此迭代器指向反向set中的第一个元素。 |
crbegin | 返回一个常量迭代器,此迭代器指向反向set中的第一个元素。 |
crend | 返回一个常量迭代器,此迭代器指向反向set中最后一个元素之后的位置。 |
emplace | 将就地构造的元素插入到set。 |
emplace_hint | 将就地构造的元素插入到set,附带位置提示。 |
empty | 如果set为空,则返回 true。 |
end | 返回一个迭代器,此迭代器指向set最后一个元素的下一个位置 |
erase | 从指定位置移除set中的元素或元素范围。 |
find | 返回一个迭代器,此迭代器指向set中其键与指定键相等的元素的位置。 |
get_allocator | 返回集合中与给定值相等的上下限的两个迭代器. |
insert | 将元素或元素范围插入到set中的指定位置。 |
key_comp | 将返回一个用于元素键值比较的函数 |
lower_bound | 返回一个迭代器,此迭代器指向set中其键值等于或大于指定键的键值的第一个元素。 |
max_size | 返回set的最大长度。 |
rbegin | 返回一个迭代器,此迭代器指向反向set中的第一个元素。 |
rend | 返回一个迭代器,此迭代器指向反向set中最后一个元素之后的位置。 |
size | 返回set中的元素数量。 |
swap | 交换两个set的元素。 |
upper_bound | 返回一个迭代器,此迭代器指向set中其键值大于指定键的键值的第一个元素。 |
#
访问操作:
这里我们需要掌握的函数有:begin,end,find,cbegin,cend.rbegin,rend,empty
因为这里的rbegin,rend,cbegin.cend用法和begin和end用法相同,所以我们这里使用begin作为示范.
插入操作:
#
set<int> T;
//***1*** 最普通的插入方式
T.insert(2);
T.insert(3);
T.insert(4);
T.insert(5);
T.insert(6);
//插入元素
cout << "遍历T的元素: " << " ";
set<int>::iterator it1 = T.begin();
while (it1 != T.end())
{
cout << *it1 << " ";
++it1;
}
cout << endl;
//***2*** 利用数组集合插入
set<int> OtherSet;
int arr[10] = { 1, 2, 3, 4, 5 };
OtherSet.insert(arr, arr + 3);
cout << "遍历OtherSet的元素: " << " ";
it1 = OtherSet.begin();
while (it1 != OtherSet.end())
{
cout << *it1 << " ";
++it1;
}
cout << endl;
//***3*** 利用迭代器区间进行插入
set<int> OtherSet2;
OtherSet2.insert(T.begin(), T.end());
cout << "遍历OtherSet的元素: " << " ";
it1 = OtherSet2.begin();
while (it1 != OtherSet2.end())
{
cout << *it1 << " ";
++it1;
}
cout << endl;
运行结果:
#
删除操作:
代码演示:
set<int> T;
int arr[10] = { 1, 2, 3, 4, 6, 7 };
T.insert(arr, arr + 6);
cout << "遍历T的元素: " << " ";
set<int>::iterator it1 = T.begin();
while (it1 != T.end())
{
cout << *it1 << " ";
++it1;
}
cout << endl;
//***1*** 找到节点迭代器然后删除节点
set<int>::iterator it2 = T.find(2);
//先找到键值为2的迭代器,然后删除该迭代器.
T.erase(it2);
cout << "遍历T的元素: " << " ";
it1 = T.begin();
while (it1 != T.end())
{
cout << *it1 << " ";
++it1;
}
cout << endl;
//***2*** 删除一个迭代器区间
it2 = T.find(3);
T.erase(it2, T.end());
//删除3到set结束这段区间的所有元素.
cout << "遍历T的元素: " << " ";
it1 = T.begin();
while (it1 != T.end())
{
cout << *it1 << " ";
++it1;
}
cout << endl;
//***3*** 终极大招 clear
T.clear();
cout << "遍历T的元素: " << " ";
it1 = T.begin();
while (it1 != T.end())
{
cout << *it1 << " ";
++it1;
}
cout << endl;
运行结果:
还没有评论,来说两句吧...