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; }
(全文完)