set是C++标准库中的一种关联容器。所谓关联容器就是通过键(key)来读取和修改元素。与map关联容器不同,它只是单纯键的集合。
set容器的每一个键只能对应一个元素,即不存在键相同的不同元素。
示例代码:
#include
#include
#include
int main(int argc, char* argv[]) {
std::vectorvec;
for(std::vector::size_type i = 0; i < 10; ++i) {
vec.push_back(i);
vec.push_back(i);
}
std::cout<< "vector : " << std::endl;
for(std::vector::iterator it = vec.begin(); it != vec.end(); ++it) {
std::cout<< *it << ",";
}
std::cout<< std::endl;
std::setst(vec.begin(), vec.end());
std::cout<< "set : " << std::endl;
for(std::set::iterator it = st.begin(); it != st.end(); ++it) {
std::cout<< *it << ",";
}
std::cout<< std::endl;
return 0;
}
输出结果:
vector :
0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9
set :
0,1,2,3,4,5,6,7,8,9
创建了一个int型的vector容器,存储20个数据,0~9每个数字都出现了两次。用整个vector初始化一个int型set容器,这个set容器却只有10个元素,0~9每个数字只出现一次。证实了set容器的每一个键只能对应一个元素。
可以使用insert操作向set容器添加元素。
示例代码:
#include
#include
#include
int main(int argc, char* argv[]) {
std::vectorvec;
vec.push_back(1);
vec.push_back(2);
std::setst;
st.insert(10);
st.insert(vec.begin(),vec.end());
std::cout<< "set : ";
for(std::set::iterator it = st.begin(); it != st.end(); ++it) {
std::cout<< *it << " ";
}
std::cout<< std::endl;
return 0;
}
输出结果:
set : 1 2 10
insert()的参数既可以是一个键,也可以是一对迭代器,它们都可以实现向set容器中添加元素,只不过函数的返回值不同。另外,可以看出向set容器中添加元素后,它会自动排序。
与map容器不同,set容器不支持下标操作访问元素。
使用count()函数可以查询元素是否存在,如果查询的元素存在则返回1,反之则0。使用find()函数,如果查询的元素存在则返回指向该元素的迭代器,反之则返回超出末端迭代器。
示例代码:
#include
#include
int main(int argc, char* argv[]) {
std::set st;
st.insert(1);
st.insert(5);
st.insert(10);
std::cout<< "count(5) : " << st.count(5) << std::endl;
std::cout<< "find(5): " << *st.find(5) << std::endl;
return 0;
}
输出结果:
count(5) : 1
find(5): 5
使用count()和find()函数查询同一元素5,count()函数返回的是该元素在set容器中的数量,find()函数则返回指向该元素的迭代器。需要注意的是,虽然使用find()函数可以返回指向该元素的迭代器,但只能对其做读操作,任何试图修改键值的操作都是非法的。