STL:set的API

目錄

set 構造、賦值、插入、刪除

set 查找操作


set是一種關聯式容器,特性如下:

  • set以RBTree作爲底層容器
  • 不允許出現鍵值重複
  • set容器只提供 insert()方法,因爲它自動進行排序
  • 不能通過迭代器來改變set的值,

可以通過set是迭代器改變元素的值嗎??

不可以改變,如果非要改變,刪除後再添加。

       如果set中允許修改鍵值的話,那麼首先需要刪除該鍵,然後調節平衡,在插入修改後的鍵值,再調節平衡,這樣嚴重破壞了set的結構,導致iterator失效,不知道應該指向之前的位置,還是指向改變後的位置。STL中將set的迭代器設置成const,不允許修改迭代器的值。

set 構造、賦值、插入、刪除

  • set構造函數

set<T>st; //set默認構造函數

set(const set &st);//拷貝構造函數

  • set賦值操作

set& operator=(const set &st);// 等號運算符的重載

swap(st);// 交換兩個容器

  • set大小操作

size();//返回容器中元素的數目

empty();//判斷容器是否爲空

  • ser插入和刪除操作

insert(elem);//在容器中插入元素

clear();//清除所有元素

erase(pos);//刪除迭代器所指的元素,返回下一個元素的迭代器

erase(beg,end);//刪除區間所有元素,返回下一個元素的迭代器

erase(elem);/刪除容器中值爲 elem的元素 

操作代碼: 

#include <algorithm>
#include <iostream>
#include<set>

using namespace std;

void Print(set<int>& s)
{
	for (set<int>::iterator it = s.begin(); it != s.end(); it++)
	{
		cout << *it <<" ";
	}

	cout << endl;
}

void test01()
{
	//set容器初始化
	set<int> s1;  //自動進行排序,默認從小到大
	s1.insert(7);
	s1.insert(2);
	s1.insert(4);
	s1.insert(5);
	s1.insert(1);

	Print(s1);//1 2 4  5 7

	set<int> s2;
	s2 = s1;//賦值

	//刪除元素
	s1.erase(s1.begin());//erase()參數爲 迭代器
	Print(s1); //2 4 5 7

	s1.erase(7);
	Print(s1);// 2 4 5

}
int main()
{
	test01();  
	return 0;
}

 打印結果:

set 查找操作

  • find(key):查找鍵key是否存在,若存在,返回該鍵的元素的迭代器,若不存在,返回set.end();
  •  lower_bound(keyElem):返回第一個key>=keyElem元素的迭代器。
  • upper_bound(keyElem):返回第一個key>keyElem元素的迭代器。
  • equal_range(keyElem):返回容器中ley與keyElemx相等的上下限的兩個迭代器,即equal_range()將lower_bound()和upper_bound()的  返回值做個一個pair返回。

操作代碼: 

#include <algorithm>
#include <iostream>
#include<set>

using namespace std;
//set的查找
void test02()
{
	set<int> s1;
	s1.insert(7);
	s1.insert(2);
	s1.insert(4);
	s1.insert(5);
	s1.insert(1);

	set<int>::iterator ret=s1.find(14);
	if (ret == s1.end())
	{
		cout << "沒有找到!" << endl;
	}
	else
	{
		cout << "ret:" << *ret << endl;
	}

	ret=s1.lower_bound(2);//找到第一個>=
	if (ret == s1.end())
	{
		cout << "沒有找到!" << endl;
	}
	else
	{
		cout << "ret:" << *ret << endl;
	}

	ret = s1.upper_bound(2);//找到第一個>
	if (ret == s1.end())
	{
		cout << "沒有找到!" << endl;
	}
	else
	{
		cout << "ret:" << *ret << endl;
	}

	//equal_range返回lower_bound和upper_bound
	pair<set<int>::const_iterator, set<int>::const_iterator> myret=s1.equal_range(2);
	if (myret.first == s1.end())
	{
		cout << "沒有找到!" << endl;
	}
	else
	{
		cout << "myret:" << *(myret.first) << endl;
	}

	if (myret.second == s1.end())
	{
		cout << "沒有找到!" << endl;
	}
	else
	{
		cout << "myret:" << *(myret.second) << endl;
	}

}

int main()
{
	//test01();  
	test02();
	return 0;
}

 打印結果:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章