set的特性是所有元素都会根据元素的键值自动被排序。set的键值就是实值,set不允许两个元素有相同的键值。
标准的STL即以RBTree作为底层机制。
下面我做一个简单的sret测试
//#include<stdio.h>
//#include"RBTree.h"
//#include<windows.h>
//int main()
//{
// TestRBTree();
// system("pause");
//}
#include<set>
#include<iostream>
#include<windows.h>
using namespace std;
int main()
{
int i;
int ia[6] = {0,1,2,3,4,5};
set<int> iset(ia, ia+6);
cout<<"size="<<iset.size()<<endl;
cout<<"3 count="<<iset.count(3)<<endl;
iset.insert(3);
cout<<"size="<<iset.size()<<endl;
iset.erase(1);
cout<<"size="<<iset.size()<<endl;
cout<<"1 count="<<iset.count(1)<<endl;
set<int>::iterator ite1=iset.begin();
set<int>::iterator ite2=iset.end();
for(; ite1 != ite2; ++ite1)
{
cout<< *ite1;
cout<<endl;
}
ite1 = iset.find(3);
if(ite1 != iset.end())
{
cout<<"3 found" <<endl;
}
ite1 = iset.find(1);
if(ite1 == iset.end())
{
cout<<"1 not found"<<endl;
}
//通过迭代器来修改set元素,是不能通过的
//*ite1 = 8;
system("pause");
}
map的特性是所有元素都会根据元素键值自动排序。map的所有元素都是pair,同时拥有value和key。map也不允许两个元素拥有相同的键值。
pair的定义
template<class K,class V>
struct pair
{
k first;
v second;
}
个人觉得两者的很多方面的实现都很相似
我主要看一下map中operator[]的特点
很明显可以看出来 其返回的是带&的值,即可以修改。
那么我们来试一下//该段代码引用自cplusplus
// accessing mapped values
#include <iostream>
#include <map>
#include <string>
int main ()
{
std::map<char,std::string> mymap;
mymap['a']="an element";
mymap['b']="another element";
mymap['c']=mymap['b'];
std::cout << "mymap['a'] is " << mymap['a'] << '\n';
std::cout << "mymap['b'] is " << mymap['b'] << '\n';
std::cout << "mymap['c'] is " << mymap['c'] << '\n';
std::cout << "mymap['d'] is " << mymap['d'] << '\n';
std::cout << "mymap now contains " << mymap.size() << " elements.\n";
return 0;
}