map的元素都是“实值/键值”所形成的一个对组。每个元素都有一个键,是排序的准则。每个键只能出现一次,不允许重复使用。map可以被视为关联式数组,也就是具有任意索引型别的数组。
set内部的元素根据其值自动排序,可以将set视作一种特殊的map,其元素实值就是键值。
关于STL中set的用法:
1、set的迭代器的使用:
#include<iostream>
#include<stdlib.h>
#include<set>
using namespace std;
int main()
{
int arr[] = { 75, 23, 65, 42, 13 };
set<int>myset(arr, arr + 5);
set<int>::iterator it1 = myset.begin();//正向迭代器的使用
while (it1 != myset.end())
{
cout << *it1 << " ";
it1++;
}
cout << endl;
set<int>::reverse_iterator it2 = myset.rbegin();//反向迭代器的使用
while (it2 != myset.rend())
{
cout << *it2 << " ";
it2++;
}
system("pause");
return 0;
}
2、关于set容量的使用方法
#include<iostream>
#include<stdlib.h>
#include<set>
using namespace std;
int main()
{
set<int>myset;
cout << "empty:"<<myset.empty() << endl;
cout << "size:"<<myset.size() << endl;
for (int i = 0; i < 5; i++)
{
myset.insert(i);
}
cout << "size:" << myset.size() << endl;
myset.insert(6);
cout << "size:" << myset.size() << endl;
cout << "empty:" << myset.empty() << endl;
system("pause");
return 0;
}
3、关于set的修改操作
3.1关于插入操作
#include<iostream>
#include<stdlib.h>
#include<set>
using namespace std;
int main()
{
set<int>myset;
set<int>::iterator it;
pair<set<int>::iterator, bool> ret;//如果插入失败则会返回一个pair类型的结构体
//pair结构体有两个成员在这里定义的第一个成员则是一个set的迭代器类型,第二个成员是一个bool类型
for (int i = 0; i < 5; i++)
{
myset.insert(i * 10);
}
ret=myset.insert(20);
if (ret.second == false)
{
it = ret.first;//如果插入失败了,此时set类型的迭代器指向当前插入失败的位置
cout <<"插入失败" <<*it << endl;
}
myset.insert(50);
myset.insert(60);
myset.insert(70);
int arr[] = { 15, 16, 17, 18 };
myset.insert(arr, arr + 4);//这种方式是按照一段区间直接插入
it = myset.begin();
while (it != myset.end())
{
cout << *it << " ";
++it;
}
system("pause");
return 0;
}
3.2、关于删除操作
#include<iostream>
#include<stdlib.h>
#include<set>
using namespace std;
int main()
{
set<int>myset;
set<int>::iterator it;
for (int i = 0; i < 5; i++)
{
myset.insert(i * 10);
}
myset.erase(0);
it = myset.begin();
++it;
myset.erase(it);
it = myset.find(30);
myset.erase(it,myset.end());
it = myset.begin();
while (it != myset.end())
{
cout << *it << " ";
++it;
}
system("pause");
return 0;
}
3.3交换操作
#include<iostream>
#include<stdlib.h>
#include<set>
using namespace std;
int main()
{
set<int>myset1;
set<int>::iterator it1;
for (int i = 0; i < 5; i++)
{
myset1.insert(i * 10);
}
set<int>myset2;
set<int>::iterator it2;
for (int i = 5; i < 10; i++)
{
myset2.insert(i * 10);
}
myset1.swap(myset2);
it1 = myset1.begin();
cout << "myset1:";
while (it1 != myset1.end())
{
cout << *it1 << " ";
++it1;
}
cout << endl;
it2 = myset2.begin();
cout << "myset2:";
while (it2 != myset2.end())
{
cout << *it2 << " ";
++it2;
}
system("pause");
return 0;
}
3.4清除操作
#include<iostream>
#include<stdlib.h>
#include<set>
using namespace std;
int main()
{
set<int>myset1;
set<int>::iterator it1;
for (int i = 0; i < 5; i++)
{
myset1.insert(i * 10);
}
myset1.clear();
cout << "myset1:";
cout << "size:"<<myset1.size() << endl;
it1 = myset1.begin();
while (it1 != myset1.end())
{
cout << *it1 << " ";
++it1;
}
cout << endl;
system("pause");
return 0;
}
4、比较操作
//在这里由于key值和value的值是一样的。方法也一样。
#include<iostream>
#include<stdlib.h>
#include<set>
using namespace std;
int main()
{
set<int>myset1;
set<int>::iterator it1;
set<int>::reverse_iterator it2;
set<int>::key_compare mycomp;//默认升序
for (int i = 0; i < 5; i++)
{
myset1.insert(i * 10);
}
it1 = myset1.begin();
it2 = myset1.rbegin();
int last = *it2;
do
{
cout << " " << *it1;
} while (mycomp(*it1++, last));
system("pause");
return 0;
}
4、关于set一些其他操作:
4.1:查找操作
#include<iostream>
#include<stdlib.h>
#include<set>
using namespace std;
int main()
{
set<int>myset1;
set<int>::iterator it1;
for (int i = 0; i < 5; i++)
{
myset1.insert(i * 10);
}
it1 = myset1.find(20);
cout << *it1;
system("pause");
return 0;
}
4.2 判断set中是否有值为key的元素
#include<iostream>
#include<stdlib.h>
#include<set>
using namespace std;
int main()
{
set<int>myset1;
set<int>::iterator it1;
for (int i = 0; i < 5; i++)
{
myset1.insert(i);
}
for (int i = 2; i < 6; i++)
{
cout << i;
if (myset1.count(i)>0)
{
cout << "is in set" << endl;
}
else
{
cout << "is not in set" << endl;
}
}
system("pause");
return 0;
}
4.3
lower_bound(val): 返回容器中第一个值【大于或等于】val的元素的iterator位置。
upper_bound(val): 返回容器中第一个值【大于】val的元素的iterator位置。
#include<iostream>
#include<stdlib.h>
#include<set>
using namespace std;
int main()
{
set<int>myset1;
set<int>::iterator it1;
set<int>::iterator itlow;
set<int>::iterator itupper;
for (int i = 0; i < 5; i++)
{
myset1.insert(i);
}
itlow=myset1.lower_bound(2);
itupper = myset1.upper_bound(3);
cout << "itlow:" << *itlow << endl;
cout <<"itupper:" <<*itupper << endl;
system("pause");
return 0;
}