当前位置:编程学习 > 网站相关 >>

标准模版库学习之关联式容器

set
std::set<int> iset;
std::set<int>::iterator it = iset.insert(4).first;
(*it)++; // error. 原因:std::set的迭代器不能修改对应的元素.
//语法上不会报错,程序中也可以修改,但会破坏有序性,set可能表现出非预期的行为
 
这是因为:
std::set的特点是: 
1.        对于插入、删除和查找操作,
set保证其时间复杂度都是O(log n); 
2.        set是一个有序的、可以前向和后向遍历的容器(双向迭代器); 
3.        set是一个元素类型和比较函数可以配置的容器,但是一经配置,就不可更改; 
4.        set的元素可以插入、删除,但是不可更改。 
 
set在任何时刻都是一个有序的结构,而一旦破坏这个有序性,set可能表现出非预期的行为。为了保证set的概念完整性,C++STL厉 
行规定了3和4两个限制,在绝大部分情况下,这两个限制是合理的。
 
但是,当我在set里面存的是shared_ptr元素时, 根本无所谓有没有序. 我就是要通过迭代器获取元素的非const引用. 解决如下:
 
#include <iostream>
#include <set>
 
template<class T>
inline T & GetStdSetElement(std::_Rb_tree_const_iterator<T>  std_set_iterator)
{
    return *(T *)&(*std_set_iterator);
}
 
int main()
{    
    using namespace std;
 
    set<int> iset;
    pair< set<int>::iterator, bool> res = iset.insert(4);
    
    int & i = GetStdSetElement(res.first);
    i++;
    
    cout << *( iset.begin() ) << endl;
    
    return 0;
}
 
[html]  
/*  
目的:学习set容器的使用  
*程序输出:  
6 5 4 3 2 1  
4 already exists  
1 2 3 4 5 6  
1 element(s) removed  
3 4 6  
*coll2.erase(coll2.begin(), coll2.find(val));  
*当coll2中不存在值等于val的元素时,会返回一个指向结尾的迭代器。  
*此时,coll2.erase(coll2.begin(), coll2.find(val));会删除coll2中所有元素。  
*/  
#include <iostream>  
#include <set>  
using namespace std;  
  
int main()  
{  
    typedef set<int, greater<int> > IntSet;  //只是构造时,创建了一个从大到小排列的容器,默认为从小到大。  
    // TEMPLATE CLASS set  
    /*  
    template<class _Kty,  
    class _Pr = less<_Kty>,  
    class _Alloc = allocator<_Kty> >  
    class set  
        : public _Tree<_Tset_traits<_Kty, _Pr, _Alloc, false> >  
        :*/  
  
    IntSet IntSetcoll;  
    IntSetcoll.insert(4);  
    IntSetcoll.insert(3);  
    IntSetcoll.insert(5);  
    IntSetcoll.insert(1);  
    IntSetcoll.insert(6);  
    IntSetcoll.insert(2);  
    IntSetcoll.insert(5);  
  
    set<int> setcoll; //默认为从小到大。  
    setcoll.insert(4);  
    setcoll.insert(3);  
    setcoll.insert(5);  
    setcoll.insert(1);  
    setcoll.insert(6);  
    setcoll.insert(2);  
    setcoll.insert(5);  
  
    IntSet::iterator pos;  
  
    for (pos = IntSetcoll.begin(); pos != IntSetcoll.end(); ++pos)  
    {  
        cout << *pos << ' ';  
    }  
    cout << endl;  
  
    pair<IntSet::iterator, bool> status = IntSetcoll.insert(4);  
    if (status.second)  
    {  
        cout << "4 inserted as element "  
            << distance(IntSetcoll.begin(), status.first) + 1   
            << endl;  
    }  
    else  
    {  
        cout << "4 already exists" << endl;  
    }  
  
    set<int> coll2(IntSetcoll.begin(), IntSetcoll.end());  
  
    copy(coll2.begin(), coll2.end(), ostream_iterator<int>(cout, " "));  
    cout << endl;  
  
    coll2.erase(coll2.begin(), coll2.find(3));  
  
    int num;  
    num = coll2.erase(5);  
    cout << num << " element(s) removed" << endl;  
  
    copy(coll2.begin(), coll2.end(), ostream_iterator<int>(cout, " "));  
    cout << endl;  
  
    getchar();  
}  
 
 
[html]  
/*  
目的:学习set容器的使用(二)  
*程序输出:  
coll1: 1 2 4 5 6 7  
coll2: 7 6 5 4 2 1  
coll1: 7 6 5 4 3 2 1  
coll1 and coll2 have same sorting criterion  
*RuntimeCmp(cmp_mode m = normal) : mode(m)  
*不能改为RuntimeCmp() : mode(normal)  
*带参数的构造函数,用来在程序运行中构造对象时传递参数  
*/  
//print.hpp头文件  
#include <iostream>  
  
/* PRINT_ELEMENTS()  
*- print optional C-string optcstr followed by  
*- all elements of the collection coll  
*- separated by spaces  
*/  
  
template <class T>  
inline void PRINT_ELEMENTS (const T& coll, const char* optcstr = "")  
{  
    typename T::const_iterator pos;  
  
    std::cout << optcstr;  
    for (pos = coll.begin(); pos != coll.end(); ++pos)  
    {  
        std::cout << *pos << ' ';  
    }  
    std::cout << std::endl;  
}  
  
#include <iostream>  
补充:综合编程 , 其他综合 ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,