标签:
一、 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;
}(全文完)
标签:
原文地址:http://blog.csdn.net/confidence_surmount/article/details/45097867