OJ的自我修养:C++内置数据结构的应用

1. 内置基本数据结构

1.1 动态数组(vector)

#include<iostream>
#include<vector>

using namespace std;

int main()
{
  const unsigned int INIT_SIZE = 5;
  vector<int> vc(INIT_SIZE,0);//定义一个大小为5的vector,并初始化为0
  for(unsigned int i=0;i<vc.size();i++) vc[i] = i; //更新vc的值

  //C++11使用auto关键字遍历
  for(auto x:vc){
    cout<<x<<endl;
  }

  vc.clear();//清除所有的元素
  vc.push_back(666);//在尾部增加一个值
  cout<<vc.back()<<endl;//获取尾部的值
  vc.pop_back();//弹出尾部的值


  //使用迭代器进行遍历
  vector<int>::iterator it;
  for(it=vc.begin();it!=vc.end();it++){
    cout<<*it<<" ";
  }
  return 0;
}

1.2. 链表(list)

#include<iostream>
#include<list>

using namespace std;

// 在第m个元素后插入
void indexInsert(list<int> &l, int m, int num)
{
    auto iter = l.begin();
    for (int i = 0; i < m; i++) {
        iter++;
    }
    l.insert(iter, num);
}
// 删除第m个元素
void indexDelete(list<int> &l, int m)
{
    if(!l.empty()){
        auto iter = l.begin();
        for (int i = 0; i < m - 1; i++) {
            iter++;
        }
        l.erase(iter);
    }
}

int main()
{
  list<int>l1;
  list<int>l2(2,0);

  l1.push_back(1);//尾部插入
  l1.push_front(2);//头部插入
  l1.pop_back();//尾部弹出
  l2.pop_front();//头部弹出

  cout<<l1.front()<<" "<<l2.back()<<endl;

  //使用迭代器进行遍历
  list<int>::iterator it;
  for(it = l1.begin();it!=l1.end();it++){
    cout<<*it<<" ";
  }
  cout<<endl;

  l1.reverse();//完成list的逆置
  l1.swap(l2);//将l1和l2交换
  l1.merge(l2);//合并两个链表
  l2.clear();//清空链表
  l2.resize(10,0);//新增0填满到长度10
  if(!l1.empty())
    l1.assign(l2.begin(),l2.end());

  for(auto x:l1)//C++11使用auto关键字遍历
  cout<<x<<" ";

  return 0;
}

1.3. 队列(queue)

#include<iostream>
#include<queue>

using namespace std;

int main()
{
  queue<int> q;
  if(q.empty()) q.push(1);
  if(!q.empty())q.pop();//弹出队头元素
  else q.push(2);//此处不会被执行
  cout<<q.size()<<endl;//输出队列大小,此时队列为空
  cout<<q.front()<<endl;//返回队头,即最早被压入队列的元素,此处为初始化随机值
  cout<<q.back()<<endl;//返回队尾,即最后被压入队列的元素,此处为1,因为只进行一次入列操作

  return 0;
}

1.4. 栈(stack)

#include<iostream>
#include<stack>

using namespace std;

int main()
{
  stack<int> s;
  if(s.empty()) s.push(1);
  if(!s.empty())s.pop();//弹出队头元素, 注意没有返回值,只是单独弹出
  else s.push(2);//此处不会被执行
  cout<<s.size()<<endl;//输出队列大小,此时队列为空
  cout<<s.top()<<endl;//返回栈顶,此时为空故无值返回

  return 0;
}

1.5. 映射(map)

#include<iostream>
#include<map>

using namespace std;

int main()
{
  map<int,string> mapStudent;//定义一个map对象
  /*如果key存在则插入失败*/
  mapStudent.insert(pair<int,string>(000,"student_zero"));//map插入键值对
  mapStudent.insert(map<int,string>::value_type(001,"student_first"));//
  /*用数组的方式插入可以覆盖key*/
  mapStudent[001] = "student_first_plus";

  cout<<mapStudent[001]<<endl;//通过下标进行元素访问

  map<int,string>::iterator it;
  it = mapStudent.find(000);//返回的是一个迭代器
  cout<<it->first<<it->second<<endl;//it->first是键,it->second是值
  mapStudent.erase(it);//用迭代器进行删除
  int n = mapStudent.erase(001);//直接通过key进行删除,成功返回1,否则返回0
  cout<<n<<endl;

  mapStudent.clear();//清除
  mapStudent.erase(mapStudent.begin(),mapStudent.end());//范围删除

  if(mapStudent.empty()){
    for(unsigned int i=0;i<5;i++)
        mapStudent[i] = "god";
  }
  int l = mapStudent.size();
  int m = mapStudent.count(1);//参数是键,不是值
  cout<<l<<endl;//输出map的大小
  cout<<m<<endl;//输出值的出现的次数,由于不会重复,所有只能是0或者1

  return 0;
}

1.6. 集合(set)

#include<iostream>
#include<set>

using namespace std;

int main()
{
  set<int> s;
  for(unsigned i=0;i<5;i++){
    s.insert(i);
  }

   set<int>::iterator it;
   //通过迭代器遍历集合
   for(it=s.begin();it!=s.end();++it){
    cout<<*it<<endl;
   }

   it = s.find(2);
   cout<<"2的定位是:"<<*it<<endl;

   cout<<"set 的 size 值为 :"<<s.size()<<endl;
   cout<<"set 的 maxsize的值为 :"<<s.max_size()<<endl;
   cout<<"set 中的第一个元素是 :"<<*s.begin()<<endl;
   cout<<"set 中的最后一个元素是:"<<*s.end()<<endl;

   s.erase(1);//删除键值key_value的值
   s.erase(s.begin(),s.end());//范围删除
   s.clear();//清空集合
   if(s.empty()){
     cout<<"set is empty!"<<endl;
   }
   cout<<"set 中 1 出现的次数是 :"<<s.count(1)<<endl;

  return 0;
}

2. 参考资料

[1] C++ vector用法(详解!!函数,实现)

[2] C++中list用法详解

[3] C++ 标准模板库STL 队列 queue 使用方法与应用介绍

[4] c++ stl栈容器stack用法介绍

[5] C++ map用法总结(整理)

[6] C++中set用法详解

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值