首页 > 编程语言 > 详细

C++顺序容器学习小结

时间:2015-04-17 18:24:08      阅读:261      评论:0      收藏:0      [点我收藏+]

C++顺序容器

一、 C++数组的描述

一维数组的动态内存分配:

      Int *num=new int[len];

       delete []num;

二维数组的动态内存分配:

1、知第二维

char (*num)[N];//指向数组的指针

num = newchar[m][N];

delete[]num;

       2、知第一维

        char*num [M];//指针的数组

for(int i=0; i<M; i++)

        num[i] = new char[n];      

for(i=0; i<M; i++)

delete[]num [i];

              delete[]num;

       3、已知一维 分配内存(保证内存的连续性)

        char*num [M];//指针的数组

num [0] = new char[M*n];

for(int i=1; i<M; i++)

num [i] = num [i-1] + n;

delete[] a[0];

       4、两维都未知

       char** num;

num = new char* [m];//分配指针数组

for(int i=0; i<m; i++)

        num[i] = new char[n];

 for(i=0; i<m; i++)

delete[]num [i];

delete[]num;

5、两维都未知,一次分配内存(保证内存的连续性)

       char ** num;

num = new char* [m];

num [0] = new char[m * n];//一次性分配所有空间

for(int i=1; i<m; i++)

            num[i] = num [i-1] + n;//分配每个指针所指向的数组

delete[]num [0];

delete[]num;

二、 C++容器类型

Vector 可变大小数组 随机访问方便

Deque 双端队列 随机访问方便

List 双向链表 容器中间插入删除很方便 如果有很多的小元素 额外开销很严重

Forward_list 单向链表 容器中间插入删除很方便 如果有很多的小元素 额外开销很严重

Array 固定大小数组

String 用以保存字符串


容器的操作:

1、向容器中添加元素:

push_back---除了array和forward_list以外,push_back从尾部添加一个元素;

push_front==list、forward_list、deque容器支持push_forward将元素从头插入;

intsert—vector ,string,list,deque都支持insert成员,forward_list支持特殊的insert。

emplace—新标准引入三个成员,,emplace_front,emplace,emplace_back是构造而不是拷贝元素,

2、在顺序容器中访问元素的操作:

Vector<string>c;

c.back();//返回c中尾部的引用,若c为空,函数行为未定义;

c.front();//返回c中头部的引用,若c为空,函数行为未定义;

c[n];

c.at(n);//返回下标为n的引用,如果下标越界,则标出异常

注意:at操作只是适用于string vector deque array操作;back不适用与forward_list.

3、删除操作:

Vector <string>c;

c.push_back();

c.push_front();

c.erase(p);

c.erase(b,e);

c.clear();

注意:删除元素的成员函数不检查其参数,在删除之前,必须保证它们存在。

4、(单向链表)forward_list的特殊使用{插入删除操作}

Forward_list<int>fist;

fist.before_begin()

fist.cbefore_begin();

fist.insert_after();

emplace_after();

fist.erase_after();

5、改变容器大小

C.resize(n);

C.resize(n,t);

6、管理容量的成员函数

 Vector<string> c;

c.shrink_yo_fit);只适用于vector string deque,将capacity()减少为size()的大小。

 c.capacity();不重新分配内存的情况下 可以存贮多少元素

 c.reserve(n);分配至少能容纳n的内存空间。

7、容器适配器

 size_type – 一种类型,足以保存当前类型的最大值

value_type—元素类型

container_type—实现适配的底层类型

 示例代码如下:

#include<iostream>
#include<string> 
#include<vector> 
using namespace std;
int main(){
	/*//容器的定义以及初始化
	//一个容器拷贝到咯、另一个容器
	list<string> str({"fht","hjs","hut"});
	vector<const char*> str1("a","b","bcx");
	//拷贝	
	forward_list<string> words(str1.begin(),str1.end()); 
	deque<string> nu(str.begin(),it);
	//使用assign赋值(仅适用于顺序容器)
	str.assign(str1.cbegin(),str1.cend());
	//使用swap交换两个相同的容器
	vector<string> a1(10);
	vector<string> a2(24);
	swap(a1,a2);
	//从尾部加入元素
	string word;
	vector<string> contains;
	while(cin>>word){
		contains.push_back(word); 
	} 
	//从头部插入元素
	list<string> li1;
	while(cin>>word){
		li1.push_front(word);
	}
	//从容器的特定位置插入
	vector<string> v2;
	list<string> li2;
	li2.insert(li2.begin(),"hello");
	li2.insert(v2.begin(),"hello");//vector虽然不支持从头部插入但是可以用这种方式插入,但是这样速度会很慢
	//forward_list的使用
	forward_list<string> fist={1,23,4,5,6,6,7,7,8,8,8,665,56,789,6,6,5,5,99,65,78};
	auto one=fist.before();//目前元素
	auto two=fist.begin();
	while(curr!=fist.end()){
		if(*curr%2)
			curr=fist.erase_after(one);
		else 
			one=curr;
		++curr;	 		   
	}*/ 
	
	//管理容量成员函数
	vector<int> num;
	cout<<"size()="<<num.size()<<endl;
	cout<<"capacity()="<<num.capacity()<<endl;
	for(vector<int>::size_type i=0;i!=40;i++){
		num.push_back(i+23);
	} 
	cout<<"size()新1="<<num.size()<<endl;
	cout<<"capacity()新1="<<num.capacity()<<endl;
	num.reserve(90);
	cout<<"size()新2="<<num.size()<<endl;
	cout<<"capacity()新2="<<num.capacity()<<endl;
	//如果在添加数据,又应该什么变化呢?
	for(int i=0;i<60;i++) 
			num.push_back(67+i);
	num.insert(num.begin(),12334);
	cout<<"添加后size()="<<num.size()<<endl;
	cout<<"添加后capacity()="<<num.capacity()<<endl; 
	//将分配超出的内存归还内存
	num.shrink_to_fit();
	cout<<"size()="<<num.size()<<endl;
	cout<<"归还后capacity()="<<num.capacity()<<endl;  
	//读取vector中数据
	cout<<"容器里的数据是:"; 
	for(int i=0;i<num.size();i++){
		cout<<num[i]<<" ";
	} 
	
	//string 的额外操作
	const char *cp="Hello world!";
	char noNull[]={'h','i'};
	string s1(cp);
	string s2(cp,6,20);
	cout<<s1<<" "<<s2<<" "<<endl;
	string s("Hello world!");
	string s3=s.substr(0,7);
	s.insert(s.size()-2,5,'?');
	cout<<s<<" "<<endl;
	s.erase(s.size()-5,5);
	cout<<s<<" "<<endl;
	//assgin方法
	s.assign(cp,13);
	cout<<s<<" "<<endl;
	//append方法
	s2.append(" ffh,sbx fy and fy");
	cout<<s2<<" "<<endl;
	s2.replace(11,4,"ffh,sbx");
	cout<<s2<<" "<<endl;
	//string搜索操作
	string name("anfsdkjhgjs dfngndfmgnd sdghsdfjg"),nu("dhfhj");
	auto posl=name.find("js");//全部匹配
	cout<<posl<<endl;
	auto po=nu.find_first_of(name);//任意一个匹配
	cout<<po<<endl;

	system("pause");
	return 0;
}


(全文完)

C++顺序容器学习小结

原文:http://blog.csdn.net/confidence_surmount/article/details/45097867

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!