stl 的utility

std::pair

#include <iostream>
#include <utility>
#include <string>
using namespace std;

int main () {
  pair <string,double> product1 ("tomatoes",3.25);
  pair <string,double> product2;
  pair <string,double> product3;

  product2.first = "lightbulbs";     // type of first is string
  product2.second = 0.99;            // type of second is double

  product3 = make_pair ("shoes",20.0);

  cout << "The price of " << product1.first << " is $" << product1.second << "\n";
  cout << "The price of " << product2.first << " is $" << product2.second << "\n";
  cout << "The price of " << product3.first << " is $" << product3.second << "\n";
  return 0;
}
utility重载了operators ==<!=>>= and <=, 这样pair 对象也可以比较了,不过先比较第一个元素 ,只有第一个元素相等的情况下才比较第2个
utility 里面的make_pair
pair <int,int> one;
  pair <int,int> two;
  one = make_pair (10,20);
  two = make_pair (10.5,'A'); // ok: implicit conversion from pair<double,char>
  cout << "one: " << one.first << ", " << one.second << "\n";
  cout << "two: " << two.first << ", " << two.second << "\n";
  return 0;
c++ makepair 的的定义
template <class T1,class T2>
  pair<T1,T2> make_pair (T1 x, T2 y)
  {
    return ( pair<T1,T2>(x,y) );
  }

std::rel_ops

namespace rel_ops {
  template <class T> bool operator!= (const T& x, const T& y) { return !(x==y); }
  template <class T> bool operator>  (const T& x, const T& y) { return y<x; }
  template <class T> bool operator<= (const T& x, const T& y) { return !(y<x); }
  template <class T> bool operator>= (const T& x, const T& y) { return !(x<y); }
}
如果使用了utility ,一个类只定义 < 和==, 其他操作符 >,<=,>=就会根据< ,自动生成代码, != 会根据== 生成代码,
例子如下
// rel_ops example:
#include <iostream>
#include <utility>
#include <cmath>
using namespace std;

class vector2d {
public:
  double x,y;
  vector2d (double px,double py): x(px), y(py) {}
  double length () const {return sqrt(x*x+y*y);}
  bool operator==(const vector2d& rhs) const {return length()==rhs.length();}
  bool operator< (const vector2d& rhs) const {return length()< rhs.length();} 
};

using namespace rel_ops;

int main () {
  vector2d a (10,10);	// length=14.14
  vector2d b (15,5);	// length=15.81
  cout << boolalpha;
  cout << "(a<b) is " << (a<b) << "\n";
  cout << "(a>b) is " << (a>b) << "\n"; // 没有定义> ,操作符,但是有#include <UITILITY> 就行了#include <utility>

return 0;
}
Output:

(a<b) is true
(a>b) is false
 
 
 

posted on 2012-12-30 14:41  GIS-MAN  阅读(438)  评论(0编辑  收藏  举报

导航