学习STL中遇到的问题

学习STL中遇到的问题

一, vector

  1. vector对象用数组方式访问时,不会自动扩张,只能访问已有的元素。
    例如下面的代码就是错误的:
#include <vector>
#include <iostream>
int main()
{
	vector<int> test;
	test[0] = 2;
	return 0;
}

二,set

  1. set集合的迭代器遍历,用set集合的迭代器的时候是没有办法比较大小的,例如下面的代码是错误的,
#include <set>
#include <iostream>
int main()
{
	set<int> s;
	s.insert(8);
	s.insert(1);
	s.insert(3);
	set<int>::iterator it;
	for(it=s.begin();it<s.end();it++)//这里it<s.end()会报错
		cout<<*it<<" ";
	cout<<endl;
	return 0;
}
  1. 元素反向遍历
    需要使用reverse_iterator迭代器
#include <iostream>
#include <set>
using namespace std;
int main()
{
    set<int> s;
    s.insert(8);
    s.insert(1);
    s.insert(12);
    s.insert(6);
    s.insert(8);
    set<int>::iterator it;
    for(it=s.begin();it!=s.end();it++)
        cout<<*it<<" ";
    cout<<endl;
    set<int>::reverse_iterator rit;
    for(rit=s.rbegin();rit!=s.rend();rit++)
        cout<<*rit<<" ";
    cout<<endl;
    return 0;
}

三、map

  1. map元素的插入
    map元素可以直接用数组的方式插入新元素,例子如下:
#include <iostream>
#include <map>
#include <string>
using namespace std;
int main()
{
    map<int,int> m;
    m[1] = 4;
    m[2] = 3;
    m[3] = 2;
    m[4] = 1;
    map<int,int>::iterator it;
    for(it=m.begin();it!=m.end();it++)
        cout<<(*it).first<<" : "<<(*it).second<<endl;
    return 0;
}

四、deque双端队列

  1. 从头部插入元素以及从中间插入元素
    从《ACM程序设计(第2版)》一书中看到对deque的介绍,说push_front和insert两个函数都不会增加新元素,只会将原有的元素覆盖,但是实际测试时却不是这样,在分别调用这两个函数之后,发现数组的元素时增加了的。实验的源代码如下:
#include <iostream>
#include <map>
#include <string>
#include <deque>
using namespace std;
int main()
{
    deque<int> d;
      int i;
    d.push_back(1);
    d.push_back(2);
    d.push_back(3);
    for(i=0;i<d.size();i++)
    {
        cout<<d[i]<<" ";
    }
    cout<<endl;
    d.push_front(10);
    d.push_front(20);
    for(i=0;i<d.size();i++)
    {
        cout<<d[i]<<" ";
    }
    cout<<endl;
    d.insert(d.begin()+1,88);

    for(i=0;i<d.size();i++)
    {
        cout<<d[i]<<" ";
    }
    cout<<endl;
    return 0;
}

五、list

  1. 迭代器只能进行 &quot; + + &quot; &quot;++&quot; "++"或者 &quot; − − &quot; &quot;--&quot; ""操作,不能进行 + n +n +n或者 − n -n n的操作,此处用insert()方法举例:
#include <iostream>
#include <list>
using namespace std;
int main()
{
    list<int> li;
    li.push_back(2);
    li.push_back(1);
    li.push_back(5);
    li.push_front(8);
    list<int>::iterator it;
    it=li.begin();
    li.insert(it++,20); //这样不会报错
    //li.insert(it+2,20);  //错误的写法
    it++;
    for(it=li.begin();it!=li.end();it++)
        cout<<*it<<" ";
    cout<<endl;
    return 0;
}
  1. sort函数与find函数
    在c++的list集合里,对list集合的元素排序的时候不是像其他元素一样调用algorithm头文件的sort函数,而是调用list自己的sort函数,而find相反,list自己没有find函数,需要调用algorithm头文件的find函数。具体实例代码如下:
#include <iostream>
#include <list>
#include <algorithm>
using namespace std;
int main()
{
    list<int> li;
    li.push_back(2);
    li.push_back(1);
    li.push_back(5);
    li.push_front(8);
    li.push_front(2);
    list<int>::iterator it;
    it=li.begin();
    li.insert(it++,20);
    it++;
    for(it=li.begin();it!=li.end();it++)
        cout<<*it<<" ";
    cout<<endl;
    li.sort();
    //sort(li.begin(),li.end());这是错误的方式
    for(it=li.begin();it!=li.end();it++)
        cout<<*it<<" ";
    cout<<endl;
    it = find(li.begin(),li.end(),2);
    //li.find(2);  错误的方式
    if(it!=li.end())
        cout<<*it<<endl;
    else
        cout<<"no found it"<<endl;
    return 0;
}

六、priority_queue

  1. 通过重载 &quot; ( ) &quot; &quot;()&quot; "()"操作符来定义优先级,通过这种方式进行比较的优先队列初始化时需要传三个参数,分别是:元素类型,内部结构,比较函数。实例如下:
#include <iostream>
#include <queue>
using namespace std;
struct myComp
{
    bool operator()(const int &a,const int &b)
    {
        return a>b;
    }
};
int main()
{
	//在这里myComp必须在第三个参数传入,所以需要把第二个参数也写上,第二个参数代表的是内部结构
    priority_queue<int,vector<int>,myComp> pq2;
    pq2.push(1);
    pq2.push(9);
    pq2.push(2);
    pq2.push(30);
    while(pq2.empty()!=true)
    {
        cout<<pq2.top()<<" ";
        pq2.pop();
    }
    cout<<endl;
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值