stl set的用法

来源:互联网 发布:淘宝瑕疵大牌化妆品 编辑:程序博客网 时间:2024/05/18 02:10
#include <stdio.h>#include <set>#include <algorithm>#include <iterator>using namespace std;struct GreaterComp : public binary_function<const int&, const int&, bool>{result_type operator()(first_argument_type& _Left, second_argument_type& _Rigth){return _Left > _Rigth;}};int main(int argc, char** argv){set<int> iset;//往set中插入元素pair<set<int>::iterator, int> ret_pair = iset.insert(1);printf("ret_pair.second: %d, *ret_pair.first: %d\n", ret_pair.second, *ret_pair.first);//重复插入某个元素ret_pair = iset.insert(1);printf("ret_pair.second: %d, *ret_pair.first: %d\n", ret_pair.second, *ret_pair.first);//王set中插入元素set<int>::iterator iter = iset.insert(iset.begin(), 2);printf("*iter: %d\n", *iter);//重复插入某个元素iter = iset.insert(iset.begin(), 2);printf("*iter: %d\n", *iter);//插入initializer_list,c++ 11特性,返回值为voidiset.insert({ 3, 4, 5 });iter = iset.begin();for (; iter != iset.end(); ++iter)printf("%d ", *iter);printf("\n");set<int> jset;//把iset.begin()和iset.end()区间的元素插入到jset中,返回值为voidjset.insert(iset.begin(), iset.end());iter = jset.begin();for (; iter != jset.end(); ++iter)printf("%d ", *iter);printf("\n");//删除指定key,返回删除key的数量int num = iset.erase(1);printf("num: %d\n", num);//重复删除num = iset.erase(1);printf("num: %d\n", num);//删除迭代器指定的元素,返回下一个元素的迭代器,如果没有下一个元素,则返回iset.end()iter = iset.erase(iset.begin());printf("%d\n", *iter);//删除指定区间的元素,返回下一个元素的迭代器iter = iset.erase(iset.begin(), iset.end());if (iter == iset.end())printf("end\n");//交换元素iset.swap(jset);printf("iset: ");iter = iset.begin();for (; iter != iset.end(); ++iter)printf("%d ", *iter);printf("\n");printf("jset: ");iter = jset.begin();for (; iter != jset.end(); ++iter)printf("%d ", *iter);printf("\n");//查找元素,返回指向查找到的元素的迭代器,若元素不存在,返回iset.end();iter = iset.find(1);printf("%d\n", *iter);iter = iset.find(-1);if (iter == iset.end())printf("end");//返回容器中的元素个数printf("size: %d\n", iset.size());//返回键为1的元素个数printf("count: %d\n", iset.count(1));iset.insert(9);/* equal_range是C++ STL中的一种二分查找的算法,试图在已排序的[first, last)中寻找value,它返回一对迭代器i和j,其中i是在不破坏次序的前提下,value可插入的第一个位置(亦即lower_bound),j则是在不破坏次序的前提下,value可插入的最后一个位置(亦即upper_bound),因此,[i, j)内的每个元素都等同于value,而且[i, j)是[first, last)之中符合此一性质的最大子区间 */pair<set<int>::iterator, set<int>::iterator> pair_iter = iset.equal_range(6);printf("pair_iter.first: %d, pair_iter.second: %d\n", *pair_iter.first, *pair_iter.second);pair_iter = iset.equal_range(10);if (pair_iter.first == iset.end() && pair_iter.second == iset.end())printf("end, end\n");/* 返回查找元素的最后一个可安插位置,也就是“元素值>查找值”的第一个元素的位置, 如果插入元素大于全部元素,返回的是last */iter = iset.upper_bound(1);printf("upper_bound: %d\n", *iter);iter = iset.upper_bound(10);if (iter == iset.end())printf("end\n");/* 函数lower_bound()在first和last中的前闭后开区间进行二分查找,返回大于或等于val的第一个元素位置。如果所有元素都小于val,则返回last的位置 */iter = iset.lower_bound(1);printf("lower_bound: %d\n", *iter);iter = iset.lower_bound(10);if (iter == iset.end())printf("end\n");set<int, GreaterComp> kset;for (int i = 1; i <= 10; i++)kset.insert(i);iter = kset.begin();for (; iter != kset.end(); ++iter)printf("%d ", *iter);printf("\n");set<int, GreaterComp>::iterator iter_greater = iset.upper_bound(1);printf("upperbound: %d\n", *iter_greater);iter_greater = iset.lower_bound(1);printf("lowerbound: %d\n", *iter_greater);set<int> mset;for (int i = 1; i <= 10; i += 2)mset.insert(i);set<int> nset;//并集set_union(iset.begin(), iset.end(), mset.begin(), mset.end(), insert_iterator<set<int>>(nset, nset.begin()));iter = nset.begin();for (; iter != nset.end(); ++iter)printf("%d ", *iter);printf("\n");//交集set<int> rset;set_intersection(iset.begin(), iset.end(), mset.begin(), mset.end(), insert_iterator<set<int>>(rset, rset.begin()));iter = rset.begin();for (; iter != rset.end(); ++iter)printf("%d ", *iter);printf("\n");getchar();return 0;}

运行结果如下:

ret_pair.second: 1, *ret_pair.first: 1ret_pair.second: 0, *ret_pair.first: 1*iter: 2*iter: 21 2 3 4 51 2 3 4 5num: 1num: 03endiset: 1 2 3 4 5jset:1endsize: 5count: 1pair_iter.first: 9, pair_iter.second: 9end, endupper_bound: 2endlower_bound: 1end10 9 8 7 6 5 4 3 2 1upperbound: 2lowerbound: 11 2 3 4 5 7 91 3 5 9

find_if的用法:

#include <map>#include <string>class map_finder{public:map_finder(const std::string &cmp_string) :m_s_cmp_string(cmp_string){}bool operator ()(const std::map<int, std::string>::value_type &pair){return pair.second == m_s_cmp_string;}private:const std::string &m_s_cmp_string;};int main(){std::map<int, std::string> my_map;my_map.insert(std::make_pair(10, "china"));my_map.insert(std::make_pair(20, "usa"));my_map.insert(std::make_pair(30, "english"));my_map.insert(std::make_pair(40, "hongkong"));std::map<int, std::string>::iterator it = my_map.end();it = std::find_if(my_map.begin(), my_map.end(), map_finder("english"));if (it == my_map.end())printf("not found\n");elseprintf("found key:%d value:%s\n", it->first, it->second.c_str());return 0;}


0 0