set容器的使用详解 其实map和set是一个爸爸 - 红黑树爸爸,只不过set力气不够,不像map那么可以拥有一个主键(key)和实键(value).它只有一个键值并且 set当中不能存储相同的键值(set还具有强迫症). 其实map和set的区别差不多就完了. 他们的相同点,他们底层都是使用红黑树构造的 这使得他们的查找,插入,删除的效率都非常的高. 并且他们都是有序的,这些都非常关键! 这是一个好的容器的标准.当然set的禁忌 也和map一样,set不能存储无法比较大小的数据. 因为构建红黑树需要比较大小. 而且在set中存储相同的键值 ,新的就会覆盖久的. set的特性是,所有元素都会根据元素的键值自动被排序. 我们可以通过set的迭代器改变set的元素值吗? 不行,因为set元素值就是其键 值,关系到set元素的排列规则,如果任意改变set元素值,会严重破坏set组织. set的源代码之中看到,set<T>::iterator被定义为底层RB_ 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; 运行结果: |
|
来自: 木三水0vosidma > 《STL》