STL --> set用法

1、set和multiset基础

set和multiset会根据特定的排序准则,自动将元素进行排序。不同的是后者允许元素重复而前者不允许。

需要包含头文件:

#include <set>

2、创建元素

set<int> s1;                    //创建空的set对象,元素类型为int,
set<const char*, strLess> s2( strLess);     //创建空的set对象,元素类型char*,比较函数对象(即排序准则)为自定义strLess
set<int> s3(s1);                  //利用set对象s1,拷贝生成set对象s2
int iArray[] = {13, 32, 19};
set<int> s4(iArray, iArray + 3);         //用迭代区间[&first, &last)所指的元素,创建一个set对象
const char* szArray[] = {"hello", "dog", "bird" };
set<const char*, strLess> s5(szArray, szArray + 3, strLess() );    //用迭代区间[&first, &last)所指的元素,及比较函数对象strLess,创建一个set对象

3、插入元素

set<string> set1;    //empty set
set1.insert("the");   //set1 now has one element
set1.insert("and");   //set1 now has two elements
set<int> set2;    //empty set
set2.insert(iset.begin(), iset.end());       //set2 now has 10 elements

例如:

// set::insert (C++98)
#include <iostream>
#include <set>

int main ()
{
  std::set<int> myset;
  std::set<int>::iterator it;
  std::pair<std::set<int>::iterator,bool> ret;

  // set some initial values:
  for (int i=1; i<=5; ++i) myset.insert(i*10);    // set: 10 20 30 40 50

  ret = myset.insert(20);               // no new element inserted

  if (ret.second==false) it=ret.first;  // "it" now points to element 20

  myset.insert (it,25);                 // max efficiency inserting
  myset.insert (it,24);                 // max efficiency inserting
  myset.insert (it,26);                 // no max efficiency inserting

  int myints[]= {5,10,15};              // 10 already in set, not inserted
  myset.insert (myints,myints+3);

  std::cout << "myset contains:";
  for (it=myset.begin(); it!=myset.end(); ++it)
    std::cout << ‘ ‘ << *it;
  std::cout << ‘\n‘;

  return 0;
}

结果:

myset contains: 5 10 15 20 24 25 26 30 40 50

4、删除元素

// erasing from set
#include <iostream>
#include <set>

int main ()
{
  std::set<int> myset;
  std::set<int>::iterator it;

  // insert some values:
  for (int i=1; i<10; i++) myset.insert(i*10);  // 10 20 30 40 50 60 70 80 90

  it = myset.begin();
  ++it;                                         // "it" points now to 20

  myset.erase (it);
  myset.erase (40);

  it = myset.find (60);
  myset.erase (it, myset.end());

  std::cout << "myset contains:";
  for (it=myset.begin(); it!=myset.end(); ++it)
    std::cout << ‘ ‘ << *it;
  std::cout << ‘\n‘;

  return 0;
}

结果:

myset contains: 10 30 50

5、查找元素

iset.find(1);     //returns iterator that refers to the element with key==1
iset.find(11);   //returns iterator == iset.end()
iset.count(1);  //returns 1;
iset.count(11); //returns 0;

//set_it refers to the element with key==1
set<int>::iterator set_it = iset.find(1);
*set_it=11;         //error: keys in a set are read-only
cout<<*set_it<<endl; //ok: can read the key

例如:

// set::find
#include <iostream>
#include <set>

int main ()
{
  std::set<int> myset;
  std::set<int>::iterator it;

  // set some initial values:
  for (int i=1; i<=5; i++) myset.insert(i*10);    // set: 10 20 30 40 50

  it=myset.find(20);
  myset.erase (it);
  myset.erase (myset.find(40));

  std::cout << "myset contains:";
  for (it=myset.begin(); it!=myset.end(); ++it)
    std::cout << ‘ ‘ << *it;
  std::cout << ‘\n‘;

  return 0;
}

结果:

myset contains: 10 30 50

6、其他

    #include <iostream>
    #include <set>
    using namespace std;  

    int main()
    {
        typedef set<int,greater<int> > IntSet;
        IntSet s1;  

        s1.insert(4);
        s1.insert(3);
        s1.insert(5);
        s1.insert(1);
        s1.insert(6);
        s1.insert(2);
        s1.insert(5);
        //the inserted element that has the same value with a element existed is emitted  

        copy(s1.begin(),s1.end(),ostream_iterator<int>(cout," "));
        cout << endl << endl;  

        pair<IntSet::iterator,bool> status = s1.insert(4);
        if(status.second)
            cout << "4 is inserted as element "
            << distance(s1.begin(),status.first) + 1 << endl;
        else
            cout << "4 already exists in s1" << endl;
        copy(s1.begin(),s1.end(),ostream_iterator<int>(cout," "));
        cout << endl << endl;  

        set<int>  s2(s1.begin(),s1.end());//default sort criterion is less<
        copy(s2.begin(),s2.end(),ostream_iterator<int>(cout," "));
        cout << endl << endl;
    }  

上述程序最后新产生一个set:s2,默认排序准则是less。以s1的元素作为初值。

注意:s1和s2有不同的排序准则,所以他们的型别不同,不能直接进行相互赋值或比较。

运行结果:

6 5 4 3 2 1 

4 already exist in s1
6 5 4 3 2 1 

1 2 3 4 5 6
时间: 2024-10-10 05:18:40

STL --> set用法的相关文章

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 set 用法

c++ stl集合set介绍 c++ stl集合(Set)是一种包含已排序对象的关联容器.set/multiset会根据待定的排序准则,自动将元素排序.两者不同在于前者不允许元素重复,而后者允许.1) 不能直接改变元素值,因为那样会打乱原... c++ stl集合set介绍 c++ stl集合(Set)是一种包含已排序对象的关联容器.set/multiset会根据待定的排序准则,自动将元素排序.两者不同在于前者不允许元素重复,而后者允许. 1) 不能直接改变元素值,因为那样会打乱原本正确的顺序,

记一些stl的用法(持续更新)

有些stl不常用真的会忘qwq,不如在这里记下来,以后常来看看 C++中substr函数的用法 1 #include<string> 2 #include<iostream> 3 using namespace std; 4 5 void main() 6 { 7 string s("12345asdf"); 8 string a=s.substr(0,5); 9 cout<<a<<endl; 10 } (以上转自:https://www

STL常见用法

1.选择C++刷算法的理由 1.C++速度快(C不是更快么,java太慢了) 2.C++有STL(什么是STL)--使用很方便的类库 3.如何使用STL进行高效刷算法 4.好处:刷算法,学习成本极低 5.如何从C到C++(仅基础语法到刷算法程度) 俗话说:磨刀不误砍柴工 不会c++仍然可以做,但是效率低 2.输入输出 C++保留了C的scanf和printf,增加了额外的cin与cout 例子 2.1.C程序中输入输出 int a; scanf("%d",&a); printf

STL vector用法介绍

介绍 这篇文章的目的是为了介绍std::vector,如何恰当地使用它们的成员函数等操作.本文中还讨论了条件函数和函数指针在迭代算法中使用,如在remove_if()和for_each()中的使用.通过阅读这篇文章读者应该能够有效地使用vector容器,而且应该不会再去使用C类型的动态数组了.   Vector总览 vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库.vector之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象

STL vector用法介绍(转)

介绍 这篇文章的目的是为了介绍std::vector,如何恰当地使用它们的成员函数等操作.本文中还讨论了条件函数和函数指针在迭代算法中使用,如在remove_if()和for_each()中的使用.通过阅读这篇文章读者应该能够有效地使用vector容器,而且应该不会再去使用C类型的动态数组了.   Vector总览 vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库.vector之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象

STL --&gt; list用法

List介绍 Lists将元素按顺序储存在链表中. 与 向量(vectors)相比, 它允许快速的插入和删除,但是随机访问却比较慢. assign()                                   给list赋值  back()                                     返回最后一个元素  begin() 返回指向第一个元素的迭代器  clear() 删除所有元素  empty() 如果list是空的则返回true  end()   返回末尾的

STL:map用法总结

一:介绍 map是STL的关联式容器,以key-value的形式存储,以红黑树(平衡二叉查找树)作为底层数据结构,对数据有自动排序的功能.命名空间为std,所属头文件<map> 二:常用操作 容量:a.map中实际数据的数据:map.size()b.map中最大数据的数量:map.max_size()c.判断容器是否为空:map.empty() 修改:a.插入数据:map.insert()b.清空map元素:map.clear()c.删除指定元素:map.erase(it) 迭代器:a.map

STL 优先队列 用法

今天做题用到了优先队列 对它的用法还不是很熟悉 现在整理一下. 需要的库 #include<queue> using namespace std; 不过我都用bits/stdc++.h... 定义 priority_queue<Type, Container, Functional> Type是数据的类型 比如int啊char啊之类的 Container是容器类型默认是vector Functional是比较的方式  比如greater<int>   less<i

stl list用法小计

list容器介绍 相对于vector容器的连续线性空间,list是一个双向链表,它有一个重要性质:插入操作和删除操作都不会造成原有的list迭代器失效,每次插入或删除一个元素就配置或释放一个元素空间.也就是说,对于任何位置的元素插入或删除,list永远是常数时间. (1)    构造函数 list<Elem> c:创建一个空的list list<Elem> c1(c2):复制另一个同类型元素的list list<Elem>c(n):创建n个元素的list,每个元素值由默