C++STL

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++STL相关的知识,希望对你有一定的参考价值。

例题

 

例题5-1 大理石在哪儿(Where is the Marble?,Uva 10474)

主要是熟悉一下sort和lower_bound的用法

关于lower_bound:

http://blog.csdn.net/niushuai666/article/details/6734403

此外还有upper_bound

http://blog.csdn.net/niushuai666/article/details/6734650

#include <iostream>
#include <string>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <stack>
#include <cctype>
using namespace std;

#define mem(a,b) memset(a,b,sizeof(a))
#define pf printf
#define sf scanf
#define spf sprintf
#define debug printf("!\n")
#define INF 10000
#define MAXN 5010
#define MAX(a,b) a>b?a:b
#define blank pf("\n")
#define LL long long

int a[10005];

int main()
{
     int n,q,i,x,cnt=1;
     while(~sf("%d%d",&n,&q) && n)
     {
          pf("CASE# %d:\n",cnt++);
          for(i=0;i<n;i++) sf("%d",&a[i]);
          sort(a,a+n);
          while(q--)
          {
               sf("%d",&x);
               int p = lower_bound(a,a+n,x)-a;
               if(a[p]!=x)
               {
                    pf("%d not found\n",x);
                    continue;
               }
               else
                    pf("%d found at %d\n",x,p+1);
          }
     }
}

 

例题5-2 木块问题(The Blocks Problem,Uva 101)

主要是熟悉vector的pb和resize,以及字符串结束的处理方法

#include <iostream>
#include <string>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <stack>
#include <cctype>
#include <vector>
using namespace std;

#define mem(a,b) memset(a,b,sizeof(a))
#define pf printf
#define sf scanf
#define spf sprintf
#define pb push_back
#define debug printf("!\n")
#define INF 10000
#define MAXN 5010
#define MAX(a,b) a>b?a:b
#define blank pf("\n")
#define LL long long

vector<int> pile[30];
int n;

void find_block(int x,int &p,int &h)
{
     for(p=0;p<n;p++)
     {
          for(h=0;h<pile[p].size();h++)
          {
               if(pile[p][h] == x) return;
          }
     }
}

void clear_block(int p,int h)
{
     int i;
     for(i = h+1;i<pile[p].size();i++)
     {
          int b = pile[p][i];
          pile[b].pb(b);
     }
     pile[p].resize(h+1);
}

void onto_block(int p,int h,int p2)
{
     int i;
     for(i = h;i<pile[p].size();i++)
          pile[p2].pb(pile[p][i]);
     pile[p].resize(h);
}

void print()
{
     int p,h;
     for(p=0;p<n;p++)
     {
          pf("%d:",p);
          for(h=0;h<pile[p].size();h++)
          {
               pf(" %d",pile[p][h]);
          }
          blank;
     }
}

int main()
{
     int i,a,b;
     sf("%d",&n);
     for(i=0;i<n;i++) pile[i].pb(i);
     char s[5],s1[5];

     while(sf("%s",s) && s[0]!=q)
     {

          sf("%d%s%d",&a,s1,&b);
          int pa,pb,ha,hb;
          find_block(a,pa,ha);
          find_block(b,pb,hb);
          if(pa==pb) continue;
          if(!strcmp(s,"move")) clear_block(pa,ha);
          if(!strcmp(s1,"onto")) clear_block(pb,hb);
          onto_block(pa,ha,pb);
     }
     print();
}

 

以上是关于C++STL的主要内容,如果未能解决你的问题,请参考以下文章

STL容器自定义内存分配器

比给定值最小的最大元素的 STL 算法

C++--第23课 - STL简介

c++ STL cout源代码

c ++:在c ++ STL中使用map编译错误? [关闭]

C++ stl 集合或链表