set
1.set的底层由RB-tree来实现的
2.set中不允许有两个元素有相同的键值,所有元素都会根据元素的键值自动被排序
3.不能通过set的迭代器来改变set的元素值(set<T>::iterator被定义为底层RB-tree的const_iterator,杜绝写入操作)
int main(int argc, const char * argv[]) {
int a[] = {1,5,4,2,3,4};
set<int> s(a,a+6);
cout<<s.size()<<endl; //s.size() == 5
s.insert(5);
cout<<s.size()<<endl; //s.size() == 5
s.erase(3);
cout<<s.size()<<endl; //s.size() == 4
s.insert(3);
cout<<s.size()<<endl; //s.size() == 5
set<int>::iterator it1 = s.begin();
set<int>::iterator it2 = s.end(); //利用迭代器来修改set中的元素是不被允许的
// *it1 = 10; error.不允许通过迭代器来修改set元素的值
for(set<int>::iterator tmp = it1; tmp != it2; ++tmp)
{
cout<<*tmp<<endl;
}
return 0;
}
map
1.map的底层由RB-tree来实现
2.map的所有元素都是pair,同时拥有键值(key)和实值(value),pair的第一元素是键值(key),第二元素为实值(value)
3.map的所有元素都会根据元素的键值(key)自动排序
4.map不允许两个元素拥有相同的键值,map的键值(key)不能被修改,实值(value)可以被修改
int main(int argc, const char * argv[]) {
map<string, int> simap;
simap["gua"] = 2;
simap["dada"] = 3;
simap["xun"] = 4;
simap["yqx"] = 10;
pair<string, int> value("pt", 10);
simap.insert(value);
map<string, int>::iterator it = simap.begin();
for(; it != simap.end(); ++it) //dada 3
{ //gua 2
cout<<it->first<<" "; //pt 10
cout<<it->second<<endl; //xun 4
} //yqx 10 会根据键值(key)来自动排序
int number = simap["gua"]; //number == 2
cout<<number<<endl;
auto it2 = simap.find("yqx");
it2->second = 9; //可以用过迭代器来修改实值
cout<<it2->first<<" ";
cout<<it2->second<<endl;
pair<string, int> pair2("tina", 22);
pair<map<string,int>::iterator, bool> ret = simap.insert(pair2);
//simap.insert(...)的返回值类型为 pair<iterator, bool> 第二个参数表示是否成功插入
//所以在此例中,返回值类型为pair<map<string,int>::iterator, bool>
//ret.first为返回值中的第一个元素,即map<string,int>::iterator,
//所以查看此迭代器指向的键值,则是(ret.first)->first,
//查看此迭代器指向的实值,则是(ret.first)->secend
cout<<(ret.first)->first<<" "; //tina
cout<<(ret.first)->second<<endl; //22
cout<<ret.second<<endl; //1
return 0;
}