迭代器的解释&&set和multiset

gcqcc 2018-08-04

莫名其妙的,要看stl了

不得不说,stl是一个优秀的东西。

虽然TA慢……

不过,可以省去好多东西啦。

下面切入正题。。。


迭代器

迭代器简单来说就是stl中的地址。是一种复杂的指针。

#include<set>

{

std::set <int>::iterator op;//定义迭代器op

op = myset.find(5);

if(op != myset.end())//如果在容器中找得到这一元素

{

myset.erase(op);//删除这一元素

}

return 0;

}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

注意:迭代器的可用基本操作符有 *(取当前迭代器所对应值,和指针一样),++(类似加等于1,把当前迭代器变为当前迭代器的下一个迭代器),– –(类似减等于1,把当前迭代器变为当前迭代器的前一个迭代器),==(逻辑符号),!=(逻辑符号),=(赋值)


set和multiset的区别

是的,TA们实际上是一个东西,区别在哪呢?

set存入数据时,如果数据重复,会覆盖。

multiset不会。

(这是老师讲的,不对勿喷)

TA们同开一个库:#include<set>

函数基本相同。


常用相关函数

insert

插入,复杂度log(n)

格式:

#include<set>

int main()

{

std::set <int> myset;

myset.insert(1);//插入“1”

return 0;

}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

还有一种读入方法

#include<set>

int main()

{

int s[]={0,1,2,3,4,5,6};

std::set <int> myset(s+1,s+7);

return 0;

}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

erase

删除,复杂度log(n)

格式:

#include<set>

int main()

{

std::set <int> myset1;

std::multiset <int> myset2;

myset1.erase(1);myset2.erase(1);

//在set中,此操作删除为1的元素

//在multiset中,此操作删除所有为1的元素

//在multiset中,可以用迭代器删除单个元素(见上面迭代器栏)

return 0;

}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

find

查找,返回元素迭代器

格式:

#include<set>

int main()

{

std::set <int> myset;

std::set <int>::iterator op;

op=myset.find(5);//op为查找到的第一个5的迭代器

return 0;

}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

begin

容器的首元素(容器中的最小元素)的迭代器

格式:

#include<set>

int main()

{

std::set <int> myset;

std::set <int>::iterator op;

op=myset.begin();//op为容器首元素的迭代器

return 0;

}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

end

容器结束的迭代器

注:不是容器末元素

格式:

#include<set>

int main()

{

std::set <int> myset;

std::set <int>::iterator op;

op=myset.end();//op为容器结束的迭代器

return 0;

}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

begin和end并用遍历容器

示例:

#include<cstdio>

#include<set>

int main()

{

int s[]={5,21,56,13,14};

std::set <int> myset(s,s+5);

for(std::set <int>::iterator it=myset.begin();

it!=myset.end();it++)

//因为it是迭代器,所以此处循环条件必为!=不能为<

printf(" %d",*it);

return 0;

}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

size

容器元素的个数

格式:

#include<set>

int main()

{

std::set <int> myset;

int cnt=myset.size();//cnt为容器中元素的个数

}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

rbegin和rend

反向迭代器

在此定义下,迭代器++操作变为把当前迭代器变为当前迭代器的前一个迭代器,– –操作同理

rbegin为容器反向首元素,同end

rend为容器反向末元素,同begin

不予举例


empty

是否为空,为空返回true,不为空返回false

不予举例


count

返回当前值在容器中出现的次数

格式:

#include<set>

int main()

{

std::set <int> myset;

int a=myset.count(5);//a为容器中5出现的次数

}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

lower_bound和upper_bound

lower_bound返回第一个大于等于当前值的元素的迭代器

upper_bound返回第一个大于当前值的元素的迭代器

时间复杂度和二分相同

不予举例


啊,终于码完了,暂时写到这里,以后不够再补充

迭代器的解释&&set和multiset

相关推荐