1,容器
数据结构 | 描述 | 实现头文件 |
向量(vector) | 连续存储的元素 | <vector> |
列表(list) | 由节点组成的双向链表,每个结点包含着一个元素 | <list> |
双队列(deque) | 连续存储的指向不同元素的指针所组成的数组 | <deque> |
集合(set) | 由节点组成的红黑树,每个节点都包含着一个元素,节点之间以某种作用于元素对的谓词排列,没有两个不同的元素能够拥有相同的次序 | <set> |
多重集合(multiset) | 允许存在两个次序相等的元素的集合 | <set> |
栈(stack) | 后进先出的值的排列 | <stack> |
队列(queue) | 先进先出的执的排列 | <queue> |
优先队列(priority_queue) | 元素的次序是由作用于所存储的值对上的某种谓词决定的的一种队列 | <queue> |
映射(map) | 由{键,值}对组成的集合,以某种作用于键对上的谓词排列 | <map> |
多重映射(multimap) | 允许键对有相等的次序的映射 | <map> |
2,vector使用指南
2.1 vector说明
标准库vector类型使用需要的头文件:#include <vector>。
vector 是一个类模板,不是一种数据类型,vector<int>是一种数据类型。
vector的存储空间是连续的,list不是连续存储的。
2.2 vector初始化
vector< typeName > v1; //默认v1为空,故下面的赋值是错误的v1[0]=5;
vector<typeName>v2(v1); 或v2=v1;或vector<typeName> v2(v1.begin(), v1.end());//v2是v1的一个副本,若v1.size()>v2.size()则赋值后v2.size()被扩充为v1.size()。
vector< typeName > v3(n,i);//v3包含n个值为i的typeName类型元素
vector< typeName > v4(n); //v4含有n个值为0的元素
vector<int> v5(a,a+5);//其中int a[4]={0,1,2,3,3}; v5的size为5,v5被初始化为a的5个值。后一个指针要指向将被拷贝的末元素的下一位置。
vector<int> v6(v5);//v6是v5的拷贝
2.3 vector常用操作
1. v.push_back(t) 在容器的最后添加一个值为t的数据,容器的size变大。
2. v.size() 返回容器中数据的个数,size返回相应vector类定义的size_type的值。
3. v.empty() 判断vector是否为空
4. v[n] 返回v中位置为n的元素
5. v.insert(pointer,n,content) 向v中pointer指向的位置插入n个content的内容。
v.insert(pointer,a[2],a[4]) 将a[2]到a[4]三个元素插入。
6. v.pop_back() 删除容器的末元素,并不返回该元素。
7. v.erase(pointer1,pointer2) 删除pointer1到pointer2中间(包括pointer1所指)的元素。
vector中删除一个元素后,此位置以后的元素都需要往前移动一个位置,虽然当前迭代器位置没有自动加1,但是由于后续元素的顺次前移,也就相当于迭代器的自动指向下一个位置一样。
8. v1==v2 判断v1与v2是否相等。
9. !=、<、<=、>、>= 保持这些操作符惯有含义。
10. vector<typeName>::iterator p=v1.begin( ); p初始值指向v1的第一个元素。*p取所指向元素的值。
p=v1.end( ); p指向v1的最后一个元素的下一位置。
12. v.clear() 删除容器中的所有元素。12.v.clear() 删除容器中的所有元素。
13. v.resize(2*v.size)或
v.resize(2*v.size, 99) 将v的容量翻倍(并把新元素的值初始化为99)
2.4 常用代码示例
#include "stdafx.h"
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
void init_vector(vector<int>&vec,int num);
void print_vector(vector<int>&vec);
void insert_array_to_vector(vector<int> &vec,int a[],int len);
int _tmain(int argc, _TCHAR* argv[])
{
int pause;
int a[] = {2,4,3,6,8,2,1,4,3};
cout<<a[0]<<endl;
vector<int> vec;
//初始化
insert_array_to_vector(vec,a,sizeof(a)/sizeof(int));
//查找
vector<int>::iterator found;
found = find(vec.begin(),vec.end(),6);
if ( found != vec.end() )
cout << "search_value found!"<<*found<<"\n";
else
cout << "search_value not found!\n";
//逆置
reverse(vec.begin(),vec.end());
//排序
sort(vec.begin(),vec.end());
//打印
print_vector(vec);
cin>>pause;
return 0;
}
void init_vector(vector<int>&vec,int num){
for(int i=0;i<num;i++){
vec.push_back(i);
}
}
void print_vector(vector<int>&vec){
vector<int>::iterator iterator = vec.begin();
while(iterator!=vec.end()){
cout<<*iterator<<" ";
iterator++;
}
cout<<endl;
}
void insert_array_to_vector(vector<int> &vec,int a[],int len){
for(int i =0;i<len;i++){
vec.push_back(a[i]);
}
}
3,list使用指南
xxx
list<string> slist;
slist.push_back("xx");
slist.push_back("oo");
slist.push_front("lala");
list<string>::iterator literator = slist.begin();
while(literator!=slist.end()){
cout<<*literator++<<" "<<endl;
}
4,map使用指南
map<string,bool> name;
string temp;
for(int i=0;i<m;i++){
cin>>temp;
name[temp]=true;
}
5,stack使用指南
s.push(x)入栈。
s.pop() 出栈。注意,出栈操作只是删除栈顶元素,并不返回该元素。
s.top() 访问栈顶
s.empty()判断栈空
s.size() 栈大小
stack<int> intStack;
for(int i=0;i<10;i++){
intStack.push(i);
}
cout<<intStack.size()<<endl;
while(!intStack.empty()){
cout<<intStack.top()<<" ";
intStack.pop();
}
6,queue使用指南
q.push(x)入队,将x接到队列的末端。
q.pop() 出队,弹出队列的第一个元素,注意,并不会返回被弹出元素的值。
q.front() 访问队首元素。
q.back() 访问队尾元素。
q.empty()判断队列空。
q.size() 访问队列中的元素个数。
deque
deque<int> intDeque;
for(int i =0;i<10;i++){
intDeque.push_front(i);//或intDeque.push_back(i);
}
while(!intDeque.empty()){
cout<<intDeque.front();
intDeque.pop_front();//或intDeque.pop_back(i);
}
queue<int> intQueue;
for(int i=0;i<10;i++){
intQueue.push(i);
}
while(!intQueue.empty()){
cout<<intQueue.front();
intQueue.pop();
}
5,泛型算法
#include<algorithm>中的泛函算法
搜索算法:find() 、search() 、count() 、find_if() 、search_if() 、count_if()
分类排序:sort() 、merge()
删除算法:unique() 、remove()
生成和变异:generate() 、fill() 、transformation() 、copy()
关系算法:equal() 、min() 、max()
xxx
8,复数类实现
#include "stdafx.h"
#include <iostream>
#include <assert.h>
#include <stack>
#include <string>
using namespace std;
class MyComplex{
private:
int real;
int imag;
public:
MyComplex();
MyComplex(int real,int imag);
~MyComplex();
MyComplex(const MyComplex& other);
MyComplex& operator=(const MyComplex& other);
MyComplex operator+(const MyComplex& other);
MyComplex operator+=(const MyComplex& other);
bool operator==(const MyComplex& other);
bool operator!=(const MyComplex& other);
friend std::istream& operator>>(std::istream & input,MyComplex & com);
friend std::ostream& operator<<(std::ostream & output,const MyComplex & com);
void SetReal(int real);
void SetImag(int imag);
void SetVal(int real,int imag);
inline int GetReal() const;
inline int GetImag() const;
};
MyComplex::MyComplex():real(0),imag(0){
}
MyComplex::MyComplex(int real,int imag):real(real),imag(imag){
}
MyComplex::~MyComplex(){
}
MyComplex::MyComplex(const MyComplex& other){
real=other.real;
imag=other.imag;
}
MyComplex& MyComplex::operator=(const MyComplex& other){
real = other.real;
imag = other.imag;
return *this;
}
MyComplex MyComplex::operator+(const MyComplex& other){
MyComplex result(*this);
result.real+=other.real;
result.imag+=other.imag;
return result;
}
MyComplex MyComplex::operator+=(const MyComplex& other){
real+=other.real;
imag+=other.imag;
return *this;
}
bool MyComplex::operator==(const MyComplex& other){
return real==other.real&&imag==other.imag;
}
bool MyComplex::operator!=(const MyComplex& other){
return !(*this==other);
}
std::ostream& operator<<(std::ostream & os,const MyComplex & com){
os<<com.real;
if(com.imag > 0) {
std::cout << "+";
}
std::cout << com.imag << "i";
return os;
}
std::istream& operator>>(std::istream & is,MyComplex & com){
std::cout<<"请输入实数部分:";
is>>com.real;
if(is)
{
std::cout<< "请输入虚数部分:" ;
is>>com.imag;
if(is)
{
return is;
}
else
{
com = MyComplex();
}
}
else
{
com = MyComplex();
}
return is;
}
void MyComplex::SetReal(int real){
this->real = real;
}
void MyComplex::SetImag(int imag){
this->imag = imag;
}
void MyComplex::SetVal(int real,int imag){
this->real = real;
this->imag = imag;
}
inline int MyComplex::GetReal() const{
return this->real;
}
inline int MyComplex::GetImag() const{
return this->imag;
}
int _tmain(int argc, _TCHAR* argv[])
{
MyComplex c1(1,2);
cout<<"c1:"<<c1<<endl;
MyComplex c2(2,4);
cout<<"c2:"<<c2<<endl;
cout<<"c1!=c2:"<<(c1!=c2)<<endl;
c1 = c2;
cout<<"c1:"<<c1<<endl;
cout<<"c1+c2:"<<c1+c2<<endl;
cout<<"c1:"<<c1<<endl;
cin>>c1;
cin>>c2;
cout<<c1<<endl;
cout<<c2<<endl;
system("pause");
return 0;
}