STL中的容器分为两大类:序列式容器和关联式容器。
序列式容器有vector、list、deque、forward_list等,为什么他们被称为序列式容器呢?因为他们的底层为线性序列的数据结构,里面存储的是元素本身。关联式容器也是用来存储数据的,与序列式容器不同的是,其里面存储的是
键值对用来表示具有一一对应关系的一种结构,该结构中一般只包含两个成员变量key和value,key代表键值,value表示与key对应的信息。
SGI-STL中关于键值对的定义:
struct pair
{typedef T1 first_type;
typedef T2 second_type;
T1 first;
T2 second;
pair():first(T1()),second(T2())//零初始化
{}
pair(const T1& a,const T2& b):first(a),first(b)
{}
};
有下面这几种方法来构造键值对:
int main()
{pairv;//v被定义为键值对类型,那就有了两个成员变量
v.first = 1;
v.second = "hello";
cout<< v.first<< " : "<< v.second<< endl;//1 : hello
pairv1(2, "Linux");
cout<< v1.first<< " : "<< v1.second<< endl;//2 : Linux
v = v1;
cout<< v.first<< " : "<< v.second<< endl;//2 : Linux
pairv2 = make_pair(3, "C++");
cout<< v2.first<< " : "<< v2.second<< endl;//3 : C++
return 0;
}
set
基本介绍注意:
验证set中的元素默认按照小于进行排序:
void main()
{vectoriv = {8,5,3,7,6,4,2,9,1 };
setis(iv.begin(), iv.end());
for (const auto &e : is)
cout<< e<< " ";//1 2 3 4 5 6 7 8 9
cout<< endl;
}
如果想要从大到小排序,则在构造的时候加上greater:
void main()
{vectoriv = {8,5,3,7,6,4,2,9,1 };
set>is(iv.begin(), iv.end());
for (const auto &e : is)
cout<< e<< " ";//9 8 7 6 5 4 3 2 1
cout<< endl;
}
set的模板参数列表template, class Alloc = allocator>class set;
set的构造T:set中存放元素的类型,实际在底层存储
的键值对
Compare:set中元素默认按照小于来比较
Alloc:set中元素空间的管理方式,使用STL提供的空间配置器。
void main()
{sets1;//构造空的set
int ar[] = {8,5,3,7,6,4,2,9,1 };
int n = sizeof(ar) / sizeof(ar[0]);
sets2(ar, ar + n);//用(first,last)区间中的元素构造set
vectorvi = {8,5,3,7,6,4,2,9,1 };
sets3(vi.begin(), vi.end());//用(first,last)区间中的元素构造set
s1 = s3;//拷贝构造
}
set的迭代器set的修改操作函数声明 | 功能 |
---|---|
pair | 在set中插入元素x,实际插入的是 |
size_type erase ( const key_type& x ) | 删除set中值为x的元素,返回被删除的元素的个数 |
void erase ( iterator position ) | 删除set中position位置上的元素 |
void erase ( iterator first, iterator last ) | 删除set中(first,last)区间中的元素 |
size_type count ( const key_type& x ) const | 返回set中值为x的元素的个数 |
void swap ( set | 交换set中的元素 |
swap代码验证:
void main()
{vectoriv = {8,5,3,7,6,4,2,9,1 };
setis(iv.begin(), iv.end());
vectoriv1 = {6,7,8,3 };
setis1(iv1.begin(), iv1.end());
is1.swap(is);
}
void main()
{vectoriv = {8,5,3,7,6,4,2,9,1 };
setis(iv.begin(), iv.end());
auto res = is.lower_bound(7);//>=7
//auto res = is.upper_bound(6);//>6
cout<< *res<< endl;
}
map
基本介绍typedef pair value_type;
template,//比较器的类型
class Alloc = allocator>//通过空间配置器来申请底层空间
>class map;
map的构造void main()
{mapismap;
mapismap = {{5,"Student"},{2,"Teacher"},{4,"Job"} };
}
map的迭代器map的元素访问函数声明 | 功能 |
---|---|
size_type size() const | 返回map中有效元素的个数 |
mapped_type& operator[] (const key_type&k) | 返回key对应的value |
void main()
{mapismap = {{5,"Student"},{2,"Teacher"},{4,"Job"} };
cout<< ismap.size()<< endl;//3
cout<< ismap.at(4)<< endl;//Job
cout<< ismap[4]<< endl;//Job
cout<< ismap[8]<< endl;//""
//cout<< ismap.at(9)<< endl;//会抛出异常
}
在元素访问时,at函数和operator[]都能通过key找到与key对应的value然后返回其引用,不同的是:当key不存在时,operator[]用默认value和key构造键值对然后插入,返回该默认value,at()函数直接抛出异常。
map中元素的修改函数声明 | 功能 |
---|---|
pair | 在map中插入键值对x,返回值也是一个键值对,iterator代表新插入元素的位置,bool代表是否插入成功 |
size_type erase ( const key_type& x ) | 删除值为x的元素 |
void erase ( iterator position ) | 删除position位置上的元素 |
void erase ( iterator first, iterator last ) | 删除(first,last)区间中的元素 |
size_type count ( const key_type& x ) const | 返回set中值为x的元素的个数 |
void swap ( set | 交换set中的元素 |
const_iterator find ( const key_type& x )const | 在map中查找key为x的元素,找到返回该元素的位置的const迭代器,否则返回cend |
size_type count ( const key_type& x ) const | 返回key为x的键值在map中的个数,注意map中key是唯一的,因此该函数的返回值要么为0,要么为1,因此可以用来检测一个key是否在map中 |
查找和插入:
void main()
{//2 4 5 8
mapismap = {{5,"Student"},
{2, "Teacher"}, {8, "Study"}, {4, "Job"} };
auto pos = ismap.find(8);//查找,找到返回该元素的迭代器
cout<< pos->first<< " : "<< pos->second<< endl;
pairv = {1,"abc" };
ismap.insert(pos, v);//插入,pos表示新插元素的位置
cout<< pos->first<< " : "<< pos->second<< endl;
for (const auto& e : ismap)
cout<< e.first<< " : "<< e.second<< endl;
}
map总结你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧