C++容器

vector

基本特点:
1.内存连续,方便访问
2.动态内存,在数据满时,会自动进行扩容,避免越界访问
3.可以进行插入和删除,效率跟操作位置有关,尾的效率最高
#include 
#include 
using namespace std;


void travl_iter(vector<int>& v)
{
    //vector::iterator it; //普通迭代器
    vector<int>::const_iterator it;//常量迭代器
    cout << endl;
    for(it=v.begin();it!=v.end();it++)
    {
        //(*it)++;
        cout << *it << ",";
    }
    cout << endl;
}

void travl(vector<int>& v)
{
    cout << endl;

    for(int i=0;i<v.size();i++)
    {
        cout << v[i] << ",";

    }
    cout << endl;
}

void print(vector<int>& v,int flag)  //正向遍历
{
    if(flag)
    {
        travl_iter(v);
    }
    else
    {
        travl(v);
    }
}


void rprint(vector<int>& v) //反向遍历
{
    //vector::iterator it; //普通迭代器
    //vector::const_iterator it;//常量迭代器
    vector<int>::reverse_iterator it;//反向迭代器
    cout << endl;
    for(it=v.rbegin();it!=v.rend();it++)
    {
        //(*it)++;
        cout << *it << ",";
    }
    cout << endl;
}

void print_c11(vector<int>& v)  //C++ 11新特性,使用for来遍历容器
{
    for(auto num : v)
    {
        cout << num << ",";
    }
    cout << endl;
}

int main()
{
    int arr[] = {1,2,3,4,5};           //没有定义初始容量
    vector<int> v1;
    vector<int> v2{1,2,3,4,5,6,};       //初始容量为6
    vector<int> v3(10);
    vector<int> v4(10,2);
    vector<int> v5(v4);
    vector<int> v6(arr,arr+2);

    cout << v2.at(3) << endl;
    cout << v2[3] << endl;

/*
    cout << v2.at(10) << endl;      //越界访问,抛出异常
    cout << v2[10] << endl;         //不抛出异常,需谨慎
*/
    cout << v1.size() << endl;
    cout << v2.size() << endl;
/*
    v2.clear();                     //清空元素,元素个数减少,但容量不变
    cout << v2.size() << endl;
*/
/*
    vector::iterator it;
    it = v2.erase(v2.begin()+2);    //删除第三个元素,获得下一个元素的迭代器,遍历删除其中某个元素需要注意
    cout << "cur:" << *it << endl;
    cout << v2.size() << endl;
    cout << v2.capacity() << endl;
*/
    cout << v2.capacity() << endl;  //6
    v2.push_back(20);               //扩容翻倍 
    cout << v2.capacity() << endl;  //12
    v2.resize(3);                   //调整实际元素个数为3
    v2.insert(v2.begin(),3,2);      //在开头插入3个2
    v2.insert(v2.end(),arr,arr+3);
    print_c11(v2);
    
    v2.erase(v2.begin(),v2.begin()+3);
    print_c11(v2);

    v2.swap(v6);;
    print_c11(v2);
    cout << v2. capacity() << endl;
    return 0;
}

list

1.内存不连续,不支持随机fangw
2.插入和删除较为便利
3.删除元素后一定要接收返回值,不然迭代器失效(无法获取下一个元素的位置)
#include 
#include 
#include 
using namespace std;


int main(){
	//错误行为
	vector<int> v(10,1024);
	vector<int>::iterator vit;
	for(vit = v.begin();vit!=v.end();vit++){
		if(*vit == 1024)
			v.erase(vit);	//无法获取下一个迭代器位置
	}
	
	//正确操作
	list<int> l(10,1024);
	list<int>::iterator it;
	for(it=l.begin();it!=l.end();it++){
		if(*it == 1024)
			it = l.erase(it);//一定要接收返回值 否则it失效了
	}

	it = l.begin();
	//it = it+4;

	return 0;	
}

map

1.键值对
2.底层实现红黑树
#include 
#include 
using namespace std;


int main(){
    map<string,int> stu;

    stu.insert(pair<string,int>("zhangsan",100));
    stu["lisi"] = 99;
    stu.insert(map<string,int>::value_type("zhaowu",80));

    map<string,int>::iterator mit;
    mit = stu.find("lisi");	//通过key减查找

    if(mit != stu.end())
        cout << "Yes" << endl;
    else 
        cout << "No" << endl;
    
    cout << stu.size() << endl;
    return 0;
}

set

1.只有值
2.存储同一类型
3.内部数据自动排序
#include 
#include 
using namespace std;

//类
class Desc{//函数对象,实现内部排序(升/降)
public:
	bool operator()(const int& t1,const int& t2){
		return t2<t1;
	}
};

int main(){
	//set s;
	set<int> s;

	s.insert(10);
	s.insert(6);
	s.insert(3);
	s.insert(5);
	s.insert(7);
	s.insert(15);

	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;	
}

你可能感兴趣的:(c++,开发语言)