C++ STL 之 set/multiset 学习

set与multiset 都是C++ 中的集合类,不同的是set中不允许存在重复元素,而multiset允许存在重复元素。
cplusplus网站列出了两个类的成员函数:

begin
返回容器首元素指针 (public 成员函数 )
end
返回容器尾元素指针 (public 成员函数)
rbegin
返回容器反向迭代首元素指针(public 成员函数 )
rend
返回容器反向迭代尾元素指针 (public 成员函数 )
cbegin
返回 const_iterator迭代首元素指针 (public 成员函数 )( const_iterator指向的元素不可改变)
cend
返回const_iterator迭代尾元素指针 (public 成员函数 )
crbegin
返回const_reverse_iterator 反向迭代首元素指针 (public 成员函数 )
crend
返回const_reverse_iterator反向迭代尾元素指针 (public 成员函数 )

empty
检测容器是否为空 (public 成员函数 )
size
返回容器长度 (public 成员函数 )
max_size
返回最大长度 (public 成员函数 )

修改:
insert
插入元素 (public 成员函数 )
erase
清除元素 (public 成员函数 )
swap
交换集合元素 (public 成员函数 )
clear
清除集合元素 (public 成员函数 )
emplace
构建容器并插入某个元素 (public 成员函数 )
emplace_hint
构建容器并插入指定元素 (public成员函数 )

观测:
key_comp
返回比较结果 (public member function )
value_comp
返回比较结果 (public member function )

操作:
find
查找容器中元素(public member function )
count
根据查找关键字查找元素下标 (public member function )
lower_bound
返回容器某个元素低界(public member function )
upper_bound
返回容器某个元素上界(public member function )
equal_range
返回容器中相同元素的范围 (public member function )

实例代码如下:

#include <iostream>
#include <set>

int main ()
{
  std::multiset<int> mymultiset;

  for (int i=0; i<5; i++) mymultiset.insert(i);

  std::multiset<int>::key_compare mycomp = mymultiset.key_comp();

  std::cout << "mymultiset contains:";

  int highest = *mymultiset.rbegin();

  std::multiset<int>::iterator it = mymultiset.begin();
  do {
    std::cout << ' ' << *it;
  } while ( mycomp(*it++,highest) );

  std::cout << '\n';

  return 0;
}

输出:

mymultiset contains: 0 1 2 3 4

类成员函数可以直接调用。
需要注意的是begin()和end()函数
begin()函数返回的是容器的第一个元素,end()返回的容器中元素的个数,即容器的尾部是容器内有效元素的个数,不知道这样理解对不对,代码展示如下:

#include <iostream>
#include <set>
using namespace std;
int main ()
{
  std::multiset<int> myset;
  std::multiset<int>::iterator itlow,itup;

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

cout<<"begin()"<<*myset.begin()<<"   end() "<<*myset.end()<<endl;

  std::cout << "myset contains:";
  for (std::set<int>::iterator it=myset.begin(); it!=myset.end(); ++it)
    std::cout << ' ' << *it;
  std::cout << '\n';

  return 0;
}

输出如下:
这里写图片描述

另外一个注意的是lower_bound(element)是容器中大于等于element的元素迭代器指针,upper_bound(element)是容器中大于element的元素迭代器指针。
代码展示如下:

#include <iostream>
#include <set>
using namespace std;
int main ()
{
  std::multiset<int> myset;
  std::multiset<int>::iterator itlow,itup;

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

  itlow=myset.lower_bound (30);                //       ^
  itup=myset.upper_bound (40);                 //                   ^
cout<<*itlow<<"  "<<*itup<<endl;

//cout<<"begin()"<<*myset.begin()<<"   end() "<<*myset.end()<<endl;

  std::cout << "myset contains:";
  for (std::set<int>::iterator it=myset.begin(); it!=myset.end(); ++it)
    std::cout << ' ' << *it;
  std::cout << '\n';

  return 0;
}

输出:
这里写图片描述
附cplusplus网址:http://www.cplusplus.com/reference/set/multiset/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值