首先,我们先来看看数据结构的定义,数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。数据结构往往同高效的检索算法和索引技术有关。
白话来讲,数据结构就是存储数据的房子,对于数据来说,排序查找都是重要的,那么选择什么样的数据结构就很重要了,首先有什么样的数据结构呢?我们最常用的是数组,数组是一大段连续的内存空间,
const int Length=100;
int *p=new int[Length];
for(int i=0;i<Length;++i)
p[i]=rand();
copy(p,p+Length,ostream_iterator<int>(cout," "));
delete []p;
数组的优势是可基于索引的快速遍历,每一个索引i的相加,都可以索引到一个该类型的数据,只是它的插入和删除都太麻烦了删除需要把后面的拷贝到前面,而插入则需要重新创建一块新的更大的内存,因此,我们有了vector<T>
#include<vector>
using namespace std;
vector<int> ivec(100);
for(int i=0;i!=ivec.size();++i)
cin>>ivec[i];
sort(ivec.begin(),ivec.end());
copy(ivec.begin(),ivec.end(),ostream_iterator<int>(cout," "));
C++的所有数据结构都做了大量细节,因为一个类中有构造函数和析构函数,在构造函数中开辟内存,在析构函数中删除内存,注意stl生态环境中使用了allocator类来管理内存,因此我们省却了内存泄漏的担忧,不仅如此,stl所有的数据结构类都是由模板构成的,这是一种在编译时期可以生成代码的高效特性,另外c++的stl还提供给我们同样的使用接口
list<int> ilst(100);
foe(list<int>::iterator it=ilst.begin();it!=ilst.end();++it){
cin>>*it;
}
ilst.sort();
copy(ilst.begin(),ilst.end(),ostream_iterator<int>(cout," "));
现在,我们看到的是list链表,链表是由数据结构struct构成的
template<class T>
struct node
{
T data;
struct node*next , *front;
};
链表的特性是可以快速的插入删除,但是遍历的速度却慢下来因为必须进行指针的迭代,对于一个网络聊天室这样总是来人和离开的应用程序呢,链表是最高效的,我们曾经说过,c++的数据结构类都提供了同样的接口,所谓同样的接口其实就是提供了相同的函数名只是内部的实现不同罢了,
template<class T>
class CList
{
struct node
{
node *next;
node *front;
T data;
};
node *_begin;
node *_end;
size _size;
CList(int size):_size(size){
_end=new node;
if(size==0){
_begin=_end;
}
else{
_begin=new node;
_begin->data=T();
}
node *pcur=_begin,*pfront=pcur;
for(int i=1;i!=_size;++i)
{
pcur->next=new node;
pcur->next->data=T();
pcur=pcur->next;
pcur->front=pfront;
pfront=pcur;
}
pcur->next=_end;
_end->front=_pcur;
_begin->front=_end;
_end->next=_begin;
}
};
上面就是list类,算得上如木三分了吧但不要写如下代码
for(int i=0;i<size;++i){
p=new node
p=p->next;
}