ch10


【相关文档】
1.size_t、ptrdiff_t

#include "stdafx.h"
#include <iostream>
#include<cassert>
#include<cstddef>
#include <cstdlib>  //for rand()
using namespace std;



class Histogram{
public:
    Histogram(ptrdiff_t minval, size_t gap, size_t n_bins);
    ~Histogram(){ delete[] bin_; }
    void record(ptrdiff_t);
    void output_to(ostream&);
private:
    ptrdiff_t const minval_, maxval_;  //最小,最大边界
    size_t const gap_;  //区间数
    size_t * const bin_;  //存储区
    size_t n_samll_, n_large_;
};

Histogram::Histogram(ptrdiff_t minval, size_t gap, size_t n_bins):minval_(minval),
        maxval_(minval+n_bins*gap-1),gap_(gap),bin_(new size_t[n_bins]),n_samll_(0),n_large_(0){
    assert(gap!=0&&n_bins!=0);
    for (int k = 0; k != n_bins; ++k){
        bin_[k] = 0;
    }
}

void Histogram::record(ptrdiff_t datapoint){
    if (datapoint < minval_){
        ++n_samll_;
    }
    else if (datapoint>maxval_){
        ++n_large_;
    }
    else
        ++bin_[(datapoint - minval_) / gap_];

}

void Histogram::output_to(ostream& o){
    o << "< " << minval_ << ": "<< n_samll_ << endl;
    for (ptrdiff_t left = minval_; left < maxval_; left += gap_){
        o << left << "..." << left + gap_ - 1 << " : " << bin_[(left - minval_) / gap_] << endl;
    }
    o << " > " << maxval_ << " : " << n_large_ << endl;
}

int main(){
    Histogram h (0,10,10);      // 间隔为10的10个区间
    for (int k = 0; k != 10000; ++k){
        h.record((int)(10.0*rand() / rand()));
    }
    h.output_to(cout);
    return 0;
}
#include "stdafx.h"
#include <iostream>
#include<typeinfo>
#include<stdexcept>
#include<string>
using namespace std;

//向量方式
class Vec_queue{
    // unsigned == unsigned int。两者一样
public:
    inline Vec_queue(unsigned capacity = default_capacity);
    ~Vec_queue(){ delete[] queue_; }
    bool empty(){ return head_ == tail_; }
    inline char dequeue();
    inline void enqueue(char);
    bool full() const{ return head_ == (tail_ + 1) %capacity_; }
    static bool const fixed_capacity = true;
private:
    static unsigned const default_capacity = 32;  //默认大小
    char * queue_;  //数组指针
    unsigned head_, tail_;  //头尾
    unsigned const capacity_; //空间大小

};

inline Vec_queue::Vec_queue(unsigned c)
            :queue_(new char[c+1]),head_(0),tail_(0),capacity_(c+1){
}

inline char Vec_queue::dequeue(){
    if (!empty()){
        char c = queue_[head_];
        head_ = (head_ + 1) % capacity_;
        return c;
    }
    else
    {
        throw underflow_error(string("queue empty!"));
    }
}

inline void Vec_queue::enqueue(char c){
    if (!full()){
        queue_[tail_] = c;
        tail_ = (tail_ + 1) % capacity_;
    }
    else
    {
        throw overflow_error(string("queue overflow!"));
    }
}

//链表方式
class Char_queue{
public:
    Char_queue(unsigned capacity = 0) :in_(&out_cell_){
        out_cell_.next_ = 0; 
    }
    ~Char_queue();
    bool empty() const{ return in_==&out_cell_; }  //尾指针等于第一个节点
    char dequeue();
    void enqueue(char);
    bool full() const{ return false; }  //链表设置为永远不满
    static bool const fixed_capacity = false;
private:
    struct Cell    //一个单元包括值和指向下一个节点的指针
    {
        Cell * next_;
        char c_;
    };
    Cell out_cell_;//头节点
    Cell * in_; //尾指针
};

Char_queue::~Char_queue(){//只保留头结点
    for (Cell *p = out_cell_.next_; p;){
        Cell * victim = p;
        p = p->next_;
        delete victim;
    }
}

char Char_queue::dequeue(){
    if (!empty()){
        Cell * victim = out_cell_.next_;
        if (victim == in_){//头节点下一个节点是尾节点
            in_ = &out_cell_;//尾指针指向头结点
        }
        char c = victim->c_;
        out_cell_.next_ = victim->next_;
        delete victim;
        return c;
    }
else
    throw underflow_error(string("queue empty!!!"));

}


void Char_queue::enqueue(char c){
    in_->next_ = new(nothrow)Cell;
    if (!in_->next_)
        throw overflow_error(string("queue  分配空间失败! "));
    in_ = in_->next_;
    in_->next_ = 0;
    in_->c_ = c;
}

int main(){
    Char_queue q(4);
    while (1){
        if (q.empty()){
            cout << "queue is empty!" << endl;
        }
        else if (q.full()){
            cout << "queue is full !!" << endl;
        }
        char cmd, ch;
        cout << "请输入命令: e(E):入列;d(D):出列;q(Q):退出;" << endl;
        cin >> cmd;
        try{
            switch (cmd)
            {
            case 'e':case 'E':cout << "输入入列的值:"; cin >> ch; q.enqueue(ch); break;
            case 'd': case 'D': cout << "Dequeued " << q.dequeue() << endl; break;
            case 'q': case 'Q': cout << "Quiting !" << endl; return 0 ;
            default:
                cerr << "Invalid command!" << endl;
                break;
            }
        }
        catch(exception &e){
            cerr << " Caught exception: " << typeid(e).name() << "  ( " << e.what() << " )" << endl;
        }

    }
}

【相关文档】
1.c++中的#include<new>

  1. C++中nothrow的介绍及使用
#include <iostream>

int main() {
   std::cout << "Hello, world!\n";
}

struct GlobalBracket {
   GlobalBracket() { std::cout << "Initialize\n"; }
   ~GlobalBracket() { std::cout << "Clean up\n"; }
} global_bracket_variable;

#include "stdafx.h"
#include <iostream>
#include<iterator>
#include<algorithm>
#include<map>
#include<sstream> //流类型转换
#include<vector>
#include<string>
using namespace std;


typedef map<string, vector<int> > LineIndex;
typedef vector<string>::const_iterator EntryIter;

LineIndex* make_line_index(istream & in, vector<string> const & entries){
    LineIndex * index = new LineIndex;
    for (EntryIter it = entries.begin(); it != entries.end(); ++it){
        (*index)[*it];//建立键
    }
    string line, word;
    int line_number = 0;
    cout << "输入每行字符串:(按Ctrl+Z结束)" << endl;
    while (getline(in,line))
    {
        ++line_number;
        stringstream words(line);
        while (words>>word)
        {
            LineIndex::iterator p = index->find(word);//查找键
            if (p != index->end())
                (*p).second.push_back(line_number);//添加行号
        }
    }
    return index;
}

int main(int argc ,char * argv[]){
    vector<string> entries;
    //预设字符串
    cout << "预存字符串有:" << endl;
    for (int k = 1; k != argc; ++k){
        entries.push_back(string(argv[k]));
        cout << argv[k] << "  ";
    }
    cout << endl;
    LineIndex * index = make_line_index(cin, entries);
    vector<string>::iterator p = entries.begin();
    for (; p != entries.end(); ++p){
        cout << "word: " << *p << " appears in lines: ";
        LineIndex::iterator lines = index->find(*p);
        //将单词的行号迭代输出
        copy((*lines).second.begin(), (*lines).second.end(),
            ostream_iterator<int>(cout, "  "));
        cout << "."<<endl;
    }
}

【相关文档】
1.C++ map的基本操作和使用
2.c++ 字符串流 sstream(常用于格式转换)
3.简单的程序诠释C++ STL算法系列之十三:copy
4.STL中istream_iterator和ostream_iterator的基本用法

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,014评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,796评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,484评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,830评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,946评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,114评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,182评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,927评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,369评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,678评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,832评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,533评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,166评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,885评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,128评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,659评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,738评论 2 351

推荐阅读更多精彩内容