C+常用数据结构

”明月如霜,好风如水,清景无限 “

所有的容器归根到底都是内存空间的排列方式和在空间上施加各种各种不同的限制所得的。空间排列方式只有线性和链式两种方式,链式是通过记录每一个数据的地址来实现查找下一位数据的。而每一个容器所具有的特性就决定了它所适用的情况,总的来看容器常用的无非是增删改查操作,下面将从适用场景、常用操作来进行总结。文远就简单的实践一下,加深记忆。

  • array (数组)
#include<stdio.h>
#include<iostream>
#include<algorithm>

#include<numeric>
#include<functional>
#include<queue>
#include<stack>
#include<list>
#include<vector>
#include<map>
#include<set>
using namespace std
int main() {system("pause");} ///凑点字数

这个就暂时跳过没啥好说的,基本和C语言的数组一样,不过也多了一些方法,当然是线性存储(连续)

  • queue(队列)
  queue <int> myqueue;
  for (int i = 1; i < 11; i++) {
    myqueue.push(i);
  }
  while (!myqueue.empty()) {
    cout << myqueue.size() << " ";
    myqueue.pop();
  }

先进先出,链式。

  • stack (栈)
  stack <int> mysatck;
  for (int i = 1; i < 11; i++) {
    mysatck.push(i);
  } 
  cout << endl;
  while (!mysatck.empty()) {
    cout << mysatck.top() << " "<<mysatck.size()<<" | ";
    mysatck.pop();
  }
  cout << endl;

后进先出//先进后出,链式/连续都有。

  • list(列表)
list <int> mylist;
  for (int i = 1; i < 11; i += 2) {
    mylist.push_back(i);
    //mylist.push_front

  }
  cout<<mylist.size()<<endl;
  mylist.remove(2);
  mylist.remove(3);
  cout << mylist.size() << endl;
  for (auto it = mylist.begin(); it != mylist.end(); ++it) {
    cout << *it << " " << mylist.front() << " | ";
    //cout << mylist.front();
  }
  cout  << endl << "back:";
  while (!mylist.empty()) {
    cout << mylist.back() << " ";
    mylist.pop_back();//倒序
  }
  cout << endl;

  //for (auto it = mylist.front(); it!=mylist.front(); ++it) {
  //  cout << it << " ";
  //}

链式,动态调整大小,很方便。

  • map(文远称之字典,很像py中的dict)
  map <int,char> mymap;//类似于py中的dict
  //初始化比较恶心,尝试两个List做出key:value
  mymap[1] = 'a';
  cout << endl << "map_at:" << mymap.at(1)<<endl;
  mymap.insert(pair<int, char>(2, 'b'));
  mymap.insert(pair<int, char>(3, 'c'));
  auto it2 = mymap.find(2);
  cout <<"mymap.find(1)="<< it2->first<<":"<<it2->second << endl;
  cout <<endl<< "map_key:" << it2->first ;
  cout << endl << "map_value:" << it2->second << endl;
  //cout << "map_it:" << *it << endl;
  cout << endl << "mymap[2]:" << mymap[2] << endl;
  //mymap.erase(map_key);
  for (auto it = mymap.begin(); it != mymap.end(); ++it) {
    cout << it->first << ":" << it->second << endl;
  }

键值对,键不能修改。

  • set(集合)
  set <int> myset;
  //myset.empty();
  //myset.size();
  for (auto i = 0; i < 10;++i){
    ++i;
    myset.insert(i);
  }
  myset.erase(2);//没有value=2
  myset.erase(5);
  cout << "for循环初始值可用,因为返回的是地址" << endl;
  auto it1 = myset.find(3);//for循环初始值可用,因为返回的是地址
  cout<< "myset.find(3)="<<*it1<<endl;

  //myset.begin
  cout << endl<<" set:";
  for (auto it = myset.begin(); it != myset.end(); ++it) {
    cout << " "<< *it  ;
  }
  cout << endl;
  int num[] = { 1,2,3,4,5,5,4,3,2,1 };
  set <int> myset1(num, num + sizeof(num) / sizeof(int));
  cout << endl << " 自动去重set_new:";
  for (auto it = myset1.begin(); it != myset1.end(); ++it) {
    cout << " " << *it;
  }
  cout << endl;

可自动去重(数组转集合)

  • vector(向量)
  vector<int> myvector;
  //vec_int.insert();
  //vec_int.empty();
  //vec_int.at(i);
  //vet_int.size();
  for (auto i = 0; i < 10; ++i) {
    ++i;
    myvector.push_back(i);
  }
  //myvector.erase();
  //vec_int.push_back(1);
  //vec_int.push_back(2);
  //vec_int.push_back(3);
  cout<<endl << "it=myvector.begin:&myvector.front():" << endl;
  for (auto it = myvector.begin(); it != myvector.end(); ++it) {
    cout << *it << " " << myvector.front()<<" | " ;
    //if (*it == 3) { myvector.erase(it); };
    //cout << mylist.front();
  }
  //cout<< endl;
  myvector.erase(myvector.begin());//去首
  cout << endl << "myvector.at:" << endl;
  for (int i = 0; i < myvector.size(); ++i) {
    cout << myvector.at(i) << " " ;
  }
  cout << endl;

使用相当广泛,链式,动态调整大小。

好了,不多说了,加深记忆。源码点击原文,如果对你有所帮助的话,记得为公众号添加星标啊。

END

作者:不爱跑马的影迷不是好程序猿

   喜欢的话请关注点赞👇 👇👇 👇                     

在这里插入图片描述

壹句: 昨日重现

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值