C语言: 数据结构有很多种-数组-链表-队列-栈-树 需要自己写代码实现
C++ 提供了STL库,里面已经完成了所有数据结构,内部全部都是使用模板实现的.
C++提供了数据结构的 模板库,给你用.
STL库包括: 数组 链表 队列 栈 数 图 .......
这些结构又称为##容器##
STL库中的容器 空间都是动态扩展的.
几种常见的容器:
vector --数组
1.随机访问 2.删除/插入很麻烦
#include
using namespace std;
#include
vector<string> k;
int main()
{
k.push_back("黄");
k.push_back("胡");
k.push_back("王");
k.push_back("徐");
k.push_back("景");
k.push_back("龙");
k.pop_back();
cout<<k.at(0)<<k.at(1)<<k.at(2)<<k.at(3)<<k.at(4)<<endl;
/*for(int i=0;i
//迭代器
vector<string>::iterator it;
cout<<"data....."<<endl;
for(it=k.begin();it!=k.end();it++)
{
cout<<" "<<*it;
}
cout<<endl;
//插入
it=k.begin();for(int i=0;i<4;i++){it++;}
k.insert(it,"陆");
cout<<"insert...."<<endl;
for(vector<string>::iterator it=k.begin();it!=k.end();it++)
{cout<<" "<<*it;}
cout<<endl;
//删除
it=k.begin();for(int i=0;i<4;i++){it++;}
k.erase(it);
cout<<"erase...."<<endl;
for(vector<string>::iterator it=k.begin();it!=k.end();it++)
{cout<<" "<<*it;}
cout<<endl;
cout<<"k is empty"<<k.empty()<<endl;
k.clear();//清空
cout<<"k is empty"<<k.empty()<<endl;//判空
return 0;
}
更高级的遍历方式: 迭代器----本质上其实就是指针 it++下一个元素 it–上一个元素 *it求内容
1.定义迭代器 (指针)
vector::iterator it; it就是一个迭代器(指针)
2.如何获取对象的 头迭代器(头指针), 尾迭代器(指向尾部的下一个) it = v.begin(); it=v.end();
list -链表
1.不能随机访问 2.插入 删除很轻松
#include
using namespace std;
#include
list<int> ll;
int main()
{
/*
尾部追加
void push_back(T val);
尾部删除
void pop_back()
查看尾部元素 取出尾部元素: 先查看,再删除
T back();
*/
ll.push_back(11); ll.push_back(22); ll.push_back(33); ll.push_back(44);
//提出尾部元素
cout<<"back is "<<ll.back()<<endl; ll.pop_back();
/*
头部追加
void push_front(T val)
头部删除
void pop_front();
查看头部 T front();
*/
ll.push_front(9); ll.push_front(8);ll.push_front(7);
//提取头部元素
cout<<"front is "<<ll.front()<<endl; ll.pop_front();
/* 迭代器遍历
*/
cout<<"travel first :";
for(list<int>::iterator it = ll.begin(); it!=ll.end(); it++){
cout<<" "<<*it;
}
cout<<endl;
/*
插入 insert (it, T val)
*/
list<int>::iterator it=ll.begin(); for(int i=0;i<4;i++){it++;}
ll.insert(it,10);
cout<<"travel insert ... :";
for(list<int>::iterator it = ll.begin(); it!=ll.end(); it++){
cout<<" "<<*it;
}
cout<<endl;
/*
删除 erase(it)
*/
it=ll.begin(); it++;it++;
ll.erase(it);
cout<<"travel erase ... :";
for(list<int>::iterator it = ll.begin(); it!=ll.end(); it++){
cout<<" "<<*it;
}
cout<<endl;
/*
int size(); 返回元素个数
bool empty(); 判空
void clear();
*/
cout<<"cnt="<<ll.size()<<endl;
cout<<"list empty? "<<ll.empty()<<endl;
ll.clear();
cout<<"list empty? "<<ll.empty()<<endl;
}
dqueue --队列
1.尾部插入 头部删除 2.求个数 3.判空 4. 遍历
#include
using namespace std;
#include
deque<int> q;
int main()
{
/*
尾部插入
void push_back(T val)
*/
q.push_back(11);q.push_back(22);q.push_back(33);q.push_back(55);q.push_back(55);
/*
头部删除
void pop_front(void)
T front()
判空 bool empty();
*/
while( q.empty() != true ){
cout<<" "<< q.front() ;
q.pop_front();
}
cout<<endl;
q.push_back(11);q.push_back(22);q.push_back(33);q.push_back(55);q.push_back(55);
for(deque<int>::iterator it = q.begin(); it!=q.end();it++ ){
cout<<" "<<*it;
}
cout<<endl;
/*
int size();获取个数
*/
cout<<" q cnt="<<q.size()<<endl;
/*
clear() 清空
*/
cout<<"q empyt? "<<q.empty()<<endl;
q.clear();
cout<<"q empyt? "<<q.empty()<<endl;
}
stack --栈
1.入栈 与出栈 2.求个数
#include
using namespace std;
#include
stack<string> sk;
int main()
{
/*入栈 push(T val)
出栈 void pop(void)
查看顶部值: T top() ,只是简单的看而已
判空:
bool empty();
个数
int size()
*/
sk.push("red"); sk.push("blue"); sk.push("yellow");sk.push("greed");
cout<<"cnt="<<sk.size()<<endl;
while(sk.empty() != true ){
cout<<sk.top()<<" ";
sk.pop();
}
cout<<"stack empty "<<sk.empty()<<endl;
sk.push("red"); sk.push("blue"); sk.push("yellow");sk.push("greed");
cout<<"stack empty "<<sk.empty()<<endl;
return 0;
}
map --树
#include
using namespace std;
#include
int main()
{
map<string,int> Map;//定一个以string为键值的map数组
Map["a"]=1;//把1赋值给下标为"a"
Map.insert(map<string,int>::value_type("b",2));
Map.insert(pair<string,int>("c",114));
Map.insert(make_pair<string,int>("d",4));
//向map插入一个元素,第一个为键值,第二个为值
cout<<Map["a"]<<' '<<Map["b"]<<' '<<Map["c"]<<' '<<Map["d"]<<'\n';
Map.insert(make_pair("b",3));
//map的insert只能插入一个,重复插入为无效操作
Map["a"]=2;
//赋值与插入不同,可以重复替换
cout<<Map["a"]<<' '<<Map["b"]<<' '<<Map["c"]<<' '<<Map["d"]<<'\n';
int x=Map["c"];
cout<<x<<'\n';
int y=Map["ccccc"];
cout<<x<<'\n';
//当它不能够找到这个值时,则自动插入一个,值为初始化
map<string,int>::iterator it;
int key;
it=Map.find("c");
if (it!=Map.end())//在map中如果找不到返回map.end()
key=it->second;//表示key等于这个键值
cout<<key<<' '<<Map["c"]<<'\n';
bool i_t;
i_t=Map.count("c");
//如果"c"在Map中返回1,否则返回0
if (i_t) cout<<"yes\n";
else cout<<"no\n";
for(it=Map.begin();it!=Map.end();it++)
cout<<it->first<<' '<<it->second<<'\n';
//使用了迭代器i_t分别指向map的键值和实际值
// first为键值, second为实际值
cout<<'\n';
for(const auto& tmp:Map)
cout<<tmp.first<<' '<<tmp.second<<'\n';
//当把迭代器这样用时,它是一个具体的值,即一个pair类型
cout<<'\n';
map<int,string> Map2;
Map2[1]="a";
Map2[2]="b";
Map2[3]="c";
for(int i=1;i<=3;i++)
cout<<Map2[i]<<' ';
cout<<'\n';
//只用但我们的键值时可以枚举的时候我们才可以这样遍历
//例如string类型就不可以
map<string,int>::iterator i__t;
i__t=Map.find("a");
Map.erase(i__t);
//使用迭代器删除,先找到为键值为"a"的值,并且把它删除
for (const auto& tmp:Map)
cout<<tmp.first<<' '<<tmp.second<<'\n';
int n=Map.erase("b");
if (n)cout<<"yes\n";
else cout<<"no\n";
for (const auto& tmp:Map)
cout<<tmp.first<<' '<<tmp.second<<'\n';
// forward_list 单向链表,基本没啥用
// unordered_+容器 ,就是用hash来存贮
map<string,int>::iterator i,j;
i=Map.begin();
j=Map.end();
i++;
j++;
Map.erase(i,j); //删去i,j之间的区间
return 0;
}
图
NULL…
未学习 日后补充