STL容器 -- Set

核心: set 是一个数学含义上的集合-----保证了每个数的确定性, 互异性, 不仅如此, set 中的元素还是有序的.

头文件: #include <set>

拓展:由于 set 内的元素是唯一的, 即不会出现相同值的元素,所以无法存储重复值.如果要想存储重复值那么可以用 multiset.

构造方法:

set<int> s1; //定义一个 int 类型的set, 默认排序是从小到大的.
set<int> s2(s1); //定义一个 int 类型的set, 其初始值从集合 s1 拷贝而来.
int arv[] = {1, 2, 3, 4};
set<int> s3(arv, arv + 4); //利用迭代器 [ begin(), end() ) 里面的元素构建一个集合 

利用仿函数构造:

set< int, greater<int> > s1; //可以改变默认排序规则,按照降序排序

自定义比较函数构造:

const char* s[] = {"1", "2", "123232", "234", "321"};
struct cmp{
    bool operator () (const char* a, const char* b) const {
        return strcmp(a, b) > 0; //按照字典序降序排列
    }
};
set<const char*, cmp> s1(s, s + 5, cmp());

集合的遍历:

set<const char*, cmp>::iterator it;//迭代器类型和集合类型一致
for(it = s1.begin(); it != s1.end(); it++) {
    cout << *it << endl;
}

集合的插入:

 s1.insert(value);//插入value,返回pair配对对象,可以根据.second判断是否插入成功,有可能因为重复元素而插入失败  

集合的删除:

s1.erase(value)  //移除 s1 内元素值为value的所有元素,返回移除的元素个数
s1.erase(&pos)  //移除pos位置上的元素,无返回值
s1.erase(&first, &last)  //移除迭代器[&first, &last)区间内的元素,无返回值
s1.clear()                     //移除容器 s1 内所有元素  

集合的查找:

s1.count(value);   //返回 s1 内元素值为value的元素个数, 为 ”1“ 或者 ”0“
s1.find(value);      //返回 s1 内 value 所在位置,找不到 value 将返回end();

自己定义类型必须重载 ”<“

struct NODE{
    int x; int y;
    bool operator < (const NODE& b) const {
        if(x == b.x) return y > b.y; //二级排序为 y 的降序
        return x < b.x; //一级排序为 x 的升序
    }
};
set<NODE> s1;

其他关于集合的操作:

s1.swap(s2);  //将集合 s1 和集合 s2 互换

//获得两个集合的 并
set<int> s1, s2, s3;
set_union(  s1.begin(),
                 s1.end(),
                 s2.begin(),
                 s2.end(),
                 insert_iterator< set<int> >(s3, s3.begin())
             );

//获得两个集合的 交
set<int> s1, s2, s3;
set_intersection( s1.begin(),
                         s1.end(),
                         s2.begin(),
                         s2.end(),
                         insert_iterator< set<int> >(s3, s3.begin())
                       );

//获得两个集合的 差
set<int> s1, s2, s3;
set_difference(   s1.begin(),     //set_symmetric_difference 为对称差 即 A 交 B - A 并 B
                         s1.end(),
                         s2.begin(),
                         s2.end(),
                         insert_iterator< set<int> >(s3, s3.begin())
                       );
时间: 2024-10-25 17:31:50

STL容器 -- Set的相关文章

STL容器简介

C++标准定义了一系列的容器的共通要求,适用于所有的STL容器,然而由于C++11带来了容器的多样化,因此可能出现若干例外. ?初始化: 每个容器都提供了一个default构造函数,一个copy函数和一个析构函数 ? ? ?

STL容器之一vector

STL中最简单也是最有用的容器之一是vector<T>类模板,称为向量容器,是序列类型容器中的一种. 容器容量可以选择性修改.(1)声明:vector<type>  v;    //容量为0构造v对象,指定元素类型为typevector<type>  v(n);    //容量为n构造v对象,指定元素类型为typevector<type>  v(n, initValue);    //容量为n构造v对象,指定元素类型为type,且所有元素被初始化为initV

STL容器的遍历删除

STL容器的遍历删除 今天在对截包程序的HashTable中加入计时机制时,碰到这个问题.对hash_map中的每个项加入时间后,用查询函数遍历hash_map,以删除掉那些在表存留时间比某个阈值长的表项(当然这个函数是应该运行在另起一个线程上的),但是在按照下面的方法对hash_map(用迭代器)遍历删除时,当找到第一个满足删除条件的元素并将其删除后,程序将提示非法: for(list<int>::iterator iter = m_map.begin(); iter != m_map.en

STL 容器

标准库为相关对象的存储集合提供了各种类型安全容器.容器是类模板:在声明容器变量时,你可以指定该容器将保存的元素类型.可以使用初始值设定项列表构造容器.它们具有用于添加和移除元素以及执行其他操作的成员函数.可使用迭代器循环访问容器中的元素以及访问单个元素.可以通过使用其成员函数和运算符以及全局函数来显式使用迭代器.还可以隐式使用它们,例如通过使用范围 for 循环.所有 STL 容器的迭代器都有一个通用接口,但是每个容器会定义自己的专用迭代器. 容器可以分为三个类别:序列容器.关联容器和容器适配器

STL容器用法速查表:list,vector,stack,queue,deque,priority_queue,set,map

STL容器用法速查表:list,vector,stack,queue,deque,priority_queue,set,map   list vector deque stack queue priority_queue set [unordered_set] map [unordered_map] multimap [unordered_multimap]     contiguous storage double-ended queue LIFO FIFO 1st is greatest  

STL容器——对map排序

STL容器(三)——对map排序 对于map的排序问题,主要分为两部分:根据key排序:根据value排序.下面我们就分别说一下~ 1. 根据key进行排序 map默认按照key进行升序排序 ,和输入的顺序无关.如果是int/double等数值型为key,那么就按照大小排列:如果是string类型,那么就按照字符串的字典序进行排列~ (还记得之前说过的字典序吗?当时我们用到了next_permutation这个库函数!)下面我们展示一个例子,说明map中默认按照key升序排列 的情况. Exam

C++ STL 容器之栈的使用

Stack 栈是种先进后出的容器,C++中使用STL容器Stack<T> 完美封装了栈的常用功能. 下面来个demo 学习下使用栈的使用. 1 //引入IO流头文件 2 #include<iostream> 3 //引入栈头文件 4 #include<stack> 5 using namespace std; 6 int main() 7 { 8 stack<int> st; 9 10 for (int i = 0; i < 10; i++) { 11

STL容器遍历时删除元素

STL容器遍历时在循环体内删除元素最容易出错了,根本原因都是因为迭代器有效性问题,在此记下通用删除方法,该方法适用于所有容器: 1 std::vector<int> myvec; 2 3 std::vector<int>::iterator it = myvec.begin(); 4 while( it != myvec.end()) 5 { 6 it = myvec.erase(it); 7 } 容器list有个比较另类的删除方法,如下代码所示: std::list<int

C++STL容器简析

标准STL序列容器:vector.string.deque和list.标准STL关联容器:set.multiset.map和multimap.非标准的关联容器hash_set.hase_multiset.hash_map和hash_multimap. (1)vector容器vector的数据安排以及操作方式,与array非常相似.两者的唯一区别在于空间的运用的灵活性.array是静态空间,一旦配置了就不能改变.vector是动态空间,随着元素的加入,它的内部机制会自行扩充空间以容纳新元素.因此,

【C++】STL容器归纳总结(一)顺序容器

顺序容器: 顺序容器包括:vector.deque.list.forward_list.array以及string vector:可变大小数组,即将元素保存在一段连续的内存空间中.支持快速随机访问.在尾部之外的位置插入删除元素可能会很慢. PS:当元素已经占满了预先分配的内存空间,插入新的元素时,开辟一段新的内存空间,大小为之前vector的两倍,再将vector内的元素拷贝到新的内存空间内. vector的插入删除操作会造成迭代器的失效 list:双向链表.只支持双向顺序访问.在list任何位