⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 assoc.h

📁 SPLASH is a c++ class library that implements many of the Perl constructs and data types, including
💻 H
字号:
/*
 * Version 1.6
 * Feeble attempt to duplicate perl associative arrays
 * So feeble I won't even call it PerlAssoc!
 * Anyway the key can only be a string, the value can be anything.
 * Written by Jim Morris,  morris@netcom.com
 */
#ifndef	_SPASSOC_H
#define _SPASSOC_H

#include <iostream.h>
#include "splash.h"

template<class T>
class Binar
{
private:
    SPString k;
    T v;

public:
    Binar(SPString a, T b) : k(a), v(b){}
    Binar(SPString a) : k(a){}
    Binar(){}
    
    Binar<T>& operator=(const Binar<T>& n){ k= n.k; v= n.v; return *this; }
    SPString& key(void){ return k; }
    const SPString& key(void) const { return k; }
    T& value(void){ return v; }
    const T& value(void) const { return v; }
    int operator==(const Binar<T>& b) const{return ((k == b.k) && (v == b.v));}    
    int operator<(const Binar& b) const {return v < b.v;} // to keep sort quiet
};

template<class T>
class Assoc
{
private:
    SPList<Binar<T> > dat;
    Binar<T> def;
    
public:
    Assoc():def(""){}
    Assoc(SPString dk, T dv) : def(dk, dv){}

    int scalar(void) const { return dat.scalar(); }
    
    SPStringList keys(void);
    SPList<T> values(void);
    
    int isin(const SPString& k) const;
    T adelete(const SPString& k);
        
    T& operator()(const SPString& k);
    Binar<T>& operator[](int i){ return dat[i]; }
};

template<class T>
SPStringList Assoc<T>::keys(void)
{
    SPStringList r;
    for(int i=0;i<dat.scalar();i++)
	r.push(dat[i].key());
    return r;
}    

template<class T>
SPList<T> Assoc<T>::values(void)
{
    SPList<T> r;
    for(int i=0;i<dat.scalar();i++)
	r.push(dat[i].value());
    return r;
}

template<class T>
T& Assoc<T>::operator()(const SPString& k)
{
    for(int i=0;i<dat.scalar();i++){
	if(k == dat[i].key()) return dat[i].value();
    }
    
    dat.push(Binar<T>(k, def.value()));
    return dat[i].value();
}

template<class T>
T Assoc<T>::adelete(const SPString& k)
{
    for(int i=0;i<dat.scalar();i++){
	if(k == dat[i].key()){
	    T r= dat[i].value();
	    dat.splice(i, 1);
	    return r;
	}
    }
    
    return def.value();
}

template<class T>
int Assoc<T>::isin(const SPString& k) const
{
    for(int i=0;i<dat.scalar();i++){
	if(k == dat[i].key()) return i+1;
    }
    return 0;
}

template<class T>
ostream& operator<<(ostream& os, Binar<T>& a)
{
    os << "(" << a.key() << ", " << a.value() << ")";
    return os;
}

template<class T>
ostream& operator<<(ostream& os, Assoc<T>& a)
{
    for(int i=0;i<a.scalar();i++){
#ifdef	TEST
	os << "[" << i << "] " << a[i] << endl;
#else
	os << a[i] << endl;
#endif
    }
    return os;
}

#if 0
template<class T>
istream& operator>>(istream& s, Binar<T>& a)
{
char c= 0;

    s >> c;
    if(c == '('){
	s >> a.key()
    }
    os << "(" << a.key() << ", " << a.value() << ")";
    return os;
}
#endif
#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -