2009年12月21日

条款2:尽量以CONST,ENUM,INLINE替换#DEFINE

类中定义常量:static const int numturns = 5;

这是声明式而非定义式。若不需取它们的地址,无须提供定义式。定义式如下:

const int GamePlayer::NumTurns;



一个class需要常量值,定义如下:

enum{NumTurns = 5};

int scores[NumTurns];



关于“形似函数的宏,最好改用inline函数替换#defines”

但,经验证明。宏的速度要比用inline的方法快。

在一些对速度要求非常严格的项目中,这个方面还是要有所取舍的。

posted @ 2009-12-21 00:18 蜜蜂 阅读(98) | 评论 (1)编辑 收藏

vector

#include <vector>
#include 
<string>
#include 
<algorithm>
#include 
<iterator>
#include 
<iostream.h>
// #include <iostream>

class GreaterThan {
public:
    GreaterThan( 
int size = 6 ) : _size( size ){}
    
int size() { return _size; }

    
bool operator()(const string & s1) {
        
return s1.size() > 6;
        }

private:
    
int _size;
};

template 
<class Type>
class PrintElem {
public:
    
void operator()( const Type &elem ) 
    {
        
++_cnt;
        
if ( _cnt % 8 == 0 ) { cout << endl; }
        cout 
<< elem << " ";
    }
    
private:
    
static int _cnt;
};

template 
< class Type >
       
int PrintElem<Type>::_cnt = 0;

class LessThan {
public:
    
bool operator()(const string & s1, const string & s2 ) {
         
return s1.size() < s2.size();
        }
};

typedef vector
<string, allocator> textwords;

void process_vocab( vector<textwords, allocator> *pvec )
{
    
if ( ! pvec ) 
         
// issue warning message
         return;

    vector
< string, allocator > texts; 

    vector
<textwords, allocator>::iterator iter = pvec->begin();
    
for ( ; iter != pvec->end(); ++iter )
              copy( (
*iter).begin(), (*iter).end(), back_inserter( texts ));

    
// sort the elements of texts
    sort( texts.begin(), texts.end() );
    for_each( texts.begin(), texts.end(), PrintElem
<string>() );

    cout 
<< endl << endl;

    
// delete all duplicate elements 
    vector<string, allocator>::iterator it;
    it 
= unique( texts.begin(), texts.end() );
    texts.erase( it, texts.end() );
    for_each( texts.begin(), texts.end(), PrintElem
<string>() );

    cout 
<< endl << endl;

    stable_sort( texts.begin(), texts.end(), LessThan() );
    for_each( texts.begin(), texts.end(), PrintElem
<string>() );

    cout 
<< endl << endl;

    
// count number of strings greater than length 6
    int cnt = 0;

    
// obsolete form of count -- standard changes this
    count_if( texts.begin(), texts.end(), GreaterThan(), cnt );

    cout 
<< "Number of words greater than length six are "
             
<< cnt << endl;

    
// 

    
static string rw[] = { "and""if""or""but""the" };
    vector
<string,allocator> remove_words( rw, rw+5 );

    vector
<string, allocator>::iterator it2 = remove_words.begin();
    
for ( ; it2 != remove_words.end(); ++it2 ) {
        
int cnt = 0;
        
// obsolete form of count -- standard changes this
            count( texts.begin(), texts.end(), *it2, cnt );
    
        cout 
<< cnt << " instances removed:  " 
                 
<< (*it2) << endl;
    
            texts.erase(
                remove(texts.begin(),texts.end(),
*it2),
                texts.end()
           );
       }

    cout 
<< endl << endl;
    for_each( texts.begin(), texts.end(), PrintElem
<string>() );
}

typedef vector
<string,allocator>::difference_type diff_type;
#include 
<fstream.h>

main()
{
     vector
<textwords, allocator> sample;
     vector
<string,allocator>       t1, t2; 
     
string               t1fn, t2fn;

     cout 
<< "text file #1: "; cin >> t1fn;
     cout 
<< "text file #2: "; cin >> t2fn;

     ifstream infile1( t1fn.c_str());
     ifstream infile2( t2fn.c_str());

     istream_iterator
< string, diff_type > input_set1( infile1 ), eos; 
     istream_iterator
< string, diff_type > input_set2( infile2 );

     copy( input_set1, eos, back_inserter( t1 ));
     copy( input_set2, eos, back_inserter( t2 ));

     sample.push_back( t1 ); sample.push_back( t2 );
     process_vocab( 
&sample );
}

posted @ 2009-12-21 00:14 蜜蜂 阅读(109) | 评论 (0)编辑 收藏

仅列出标题  
<2019年7月>
30123456
78910111213
14151617181920
21222324252627
28293031123
45678910

导航

统计

常用链接

留言簿

随笔分类

随笔档案

搜索

最新评论

阅读排行榜

评论排行榜