第二章 STL简介

容器共同操作操作
insert(pos,e): 将元素e的拷贝安插于迭代器pos所指的位置
erase(beg,end): 移除[beg,end]区间内的所有元素
clear(): 移除所有元素
**

**

vector

c.size() 返回元素个数
c.empty() 判断容器是否为空
c.max_size() 返回元素最大可能数量(固定值)
c.capacity() 返回重新分配空间前可容纳的最大元素数量
c.reserve(n) 扩大容量为n

#include <iostream>
#include <vector>
using namespace std;
int main(){
	vector<int> v1(10),v2;
	int i;
	v1.push_back(123);
	v2=v1;
	cout<<v2.capacity()<<endl;
	for(i=0;i<v1.size();i++)
		cout<<v1.at(i)<<"   ";
	cout<<endl;
	return 0;
}

迭代器相关函数

begin() 返回一个迭代器,指向第一个元素
end() 返回一个迭代器,指向最后一个元素之后
rbegin() 返回一个逆向迭代器,指向逆向遍历的第一个元素
rend() 返回一个逆向迭代器,指向逆向遍历的最后一个元素之后

**

**
vector 和 数组的区别
1.array 定义的时候必须定义数组的元素个数;而vector 不需要;
2.array 定义后的空间是固定的了,不能改变;而vector 要灵活得多,可再加或减.
3.vector有一系列的函数操作,非常方便使用。
4.数组和vector不同,一个数组不能用另一个数组初始化,也不能将一个数组赋值给另一个数组;

**

**

list

从键盘输入10个整数,用这些整数值作为结点数据,生成一个链表,按顺序输出链表中结点的数值。然后从键盘输入一个待查找整数,在链表中查找该整数,若找到则删除该整数所在的结点(如果出现多次,全部删除),然后输出删除结点以后的链表。在程序结束之前清空链表。

#include <iostream>
#include <list>
using namespace std ;
int main(){
 list<int> Link;	
 int i, key, item;    
 for(i=0;i < 10;i++) { 
    cin>>item;
    Link.push_front(item);
 }
 cout<<"List: "; // 输出链表
list<int>::iterator p=Link.begin(); 
 while(p!=Link.end()) { 
p<Link.end()
     cout <<*p << "  ";
     p++;  //使P指向下一个节点
  }
   cout << endl;
   cout << "请输入一个需要删除的整数: ";
   cin >> key;
   Link.remove(key);   
   cout << "List: "; 
   p=Link.begin();	
   while(p!=Link.end()){	
       cout <<*p << "  ";
       p++; 	
   }
   cout << endl;
}



**

**

set / multiset:集合

基本原理

将插入的值(第一个操作数)与树根(第二个操作数)(红黑树,二叉排序树)进行比较,如果返回值是true,则在左子树中进行插入

否则在右子树中进行插入

#include <iostream>
#include <set>
using namespace std;
int main(){
    set<int> s;
    s.insert(3);
    s.insert(2);
    s.insert(1);
    s.insert(1);
    cout<<"set 的 size 值为 :"<<s.size()<<endl;
    cout<<"set 的 maxsize的值为 :"<<s.max_size()<<endl;
    cout<<"set 中的第一个元素是 :"<<*s.begin()<<endl;
    cout<<"set 中的最后一个元素是:"<<*s.end()<<endl;
    s.clear();
    if(s.empty())    {        cout<<"set 为空 !!!"<<endl;    }
    cout<<"set 的 size 值为 :"<<s.size()<<endl;
    cout<<"set 的 maxsize的值为 :"<<s.max_size()<<endl;
    return 0;
}

set容器的遍历

#include <iostream>
#include <set>
using namespace std;
int main(){
    set<int> s;
    set<int>::iterator ite;
    s.insert(3);    
    s.insert(2);
    s.insert(1); 
    s.insert(1);
    for(ite=s.begin();ite!=s.end();ite++)
		cout<<*ite<<"   ";
	cout<<endl;
    ite=s.begin();
	while(p!=s.end())	{
		cout<<*ite<<"   ";	p++;
	}
    return 0;
}

1. 修改比较函数

#include <iostream>
#include <set>
#include <algorithm>
using namespace std;
int main(){
    set<int, greater<int> > s;
    set<int,greater<int> >::iterator iter;
	s.insert (1);
	s.insert(3);
	for(iter=s.begin ();iter!=s.end();iter++)
		cout<<*iter<<" ";
	cout<<endl;
    return 0;
}

2. 重载 < 运算符

#include <iostream>
#include <set>
#include <iterator>
using namespace std;
class Integer{
    int data;
    public:
    Integer(int a=0)    {
        data=a;
    }
    bool operator <(const Integer b) const {
        return data>b.data;
    }
    friend ostream & operator<<(ostream &out, Integer a)    {
        out<<a.data;
        return out;
    }
};
int main(){
    set<Integer> s;
    set<Integer>::iterator ite;
    Integer a(1),b(3);
    s.insert(a);
    s.insert(b);
    for(ite=s.begin();ite!=s.end();ite++) {
        cout<<*ite<<" ";
    }
    return 0;
}

3. 自定义比较函数

#include<iostream>
#include<set>
using namespace std;
struct mycomp{      //自定义比较函数,重载“()”操作符
	bool operator() (const int &a, const int &b)	{
		return a > b;
	}
};
int main(){
	set<int, mycomp> s; //采用比较函数mycomp
	s.insert(5); 
	s.insert(1);
	s.insert(6);
	s.insert(3);
	s.insert(5); 
	set<int,mycomp>::iterator it;
	for(it = s.begin(); it != s.end(); it++)
		cout << *it << " ";
	cout << endl;
	return 0;
}


**

**

Map

气球问题

#include <iostream>
#include <map>
#include <iterator>
#include <string>
using namespace std;
int main(){
	int n, iMax=0;
	while(cin>>n && n>0){
		map<string, int > Balloon;
		string s;
		for(int i=0;i<n;i++){	cin>>s;	Balloon[s]++;}
		map<string ,int >::iterator point,loc;
		for(point=Balloon.begin();point!=Balloon.end();point++)
			if(iMax<point->second){
				iMax=point->second;loc=point;}
		cout<<loc->first <<endl;
	}	
return 0; 
 }

优先队列

要改变优先关系(比如,最小值的优先级最高)
方法一:改变比较函数
方法二:重载数据元素的<运算符

1. 普通方法:

#include <iostream>
#include <queue>
using namespace std;
int main(){
	priority_queue<int> q;
	q.push(1);	q.push(10);	q.push(3);	q.push(4);
	while(!q.empty ()){
		int s;
		s=q.top ();
		cout<<s<<"  ";
		q.pop();
	}
	return 0;
}

2、重载 < 运算符

#include <iostream>
#include <queue>
#include <cstring>
using namespace std;
class Student{
	char name[10];
	char num[10];
	int score;
public:
	Student(	){}
	Student( char *name, char *num, int score)	{
		strcpy(this->name,name);
		strcpy(this->num,num);
		this->score=score;
	}
	friend bool operator <(Student s1,Student s2)    
	{	return s1.score<s2.score;  	}
	void display()	{cout<<name<<"\t"<<num<<"\t"<<score<<endl;	}
};

int main()
{
	priority_queue<Student>  q;
	Student s1("A","1",90),s2("B","2",99),s3("C","3",70);
	q.push(s1);
	q.push (s2);
	q.push(s3);
	while(!q.empty())
	{
		Student x;
		x=q.top();
		q.pop();
		x.display();
	}
	cout<<endl;
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值