Chinaunix首页 | 论坛 | 博客
  • 博客访问: 97538
  • 博文数量: 21
  • 博客积分: 145
  • 博客等级: 入伍新兵
  • 技术积分: 250
  • 用 户 组: 普通用户
  • 注册时间: 2012-12-22 17:37
文章分类

全部博文(21)

文章存档

2013年(16)

2012年(5)

我的朋友

分类: C/C++

2012-12-24 21:10:21

大致浏览了一下chapter3和chapter4,直接到chapter5

这一章简单介绍了一下vector和deque,以及他们各自的实现原理。
vector和deque,主要特点是向后插入和随机访问是常数级别复杂度,deque比vector
强悍的地方,就是在前端插入也是常数级别的,但是代价就是deque比vector要难实现。
deque用一个辅助索引数组,实现两端插入都是常数,感觉还是巧妙的。
vector貌似是只扩大空间,而deque还会回收空间。

这两个顺序容器,对于随机位置的插入、删除,开销是线性级别,这个比list要差很多。


#########################
课后project

1. 扩展very_long_int类
简单描述:实现非大整数之间的基本运算:加法、减法、乘法、除法和幂运算。

算法:
加法,减法,乘法,直接用手工计算的方法;除法,用减法实现;幂运算,将指数转为二进制后,累乘即可。

类定义:

点击(此处)折叠或打开

  1. #ifndef VERY_LONG_INT_H
  2. #define VERY_LONG_INT_H

  3. #include <vector>
  4. #include <string>
  5. #include <iostream>

  6. class very_long_int {
  7. public:
  8.     very_long_int() {}
  9.     very_long_int(const very_long_int &another) {
  10.         digits = another.digits;
  11.     }
  12.     very_long_int(const std::string &str);
  13.     
  14.     very_long_int operator+(const very_long_int &another) const;
  15.     very_long_int operator-(const very_long_int &another) const;
  16.     very_long_int operator*(const very_long_int &another) const;
  17.     very_long_int operator/(const very_long_int &another) const;

  18.     /*
  19.      * if *this > another, return 1
  20.      * else if *this == another, return 0
  21.      * else return -1
  22.      */
  23.     int compare(const very_long_int &another) const;

  24.     /* transform the digits into a readable sequence */
  25.     std::string toString() const;
  26.     
  27.     very_long_int pow(unsigned int exp) const;

  28.     friend std::ostream& operator<<(std::ostream &out, const very_long_int &very_long);
  29. private:
  30.     std::vector<char> digits; // digits stored in reverse order

  31.     bool isZero() const;
  32. };

  33. #endif // VERY_LONG_INT_H

除法:

点击(此处)折叠或打开

  1. very_long_int very_long_int::operator/(const very_long_int &another) const {
  2.     assert(!another.isZero()); // check zero
  3.     very_long_int result;
  4.     int sign = compare(another);
  5.     if (sign < 0) {
  6.         result.digits.push_back(0);
  7.         return result;
  8.     } else if (sign == 0) {
  9.         result.digits.push_back(1);
  10.         return result;
  11.     }

  12.     very_long_int left = *this;
  13.     very_long_int right = another;
  14.     right.digits.insert(right.digits.begin(),
  15.             digits.size()-right.digits.size(), 0);
  16.     while ( left.compare(another) >= 0 ) {
  17.         char carry = 0;
  18.         while ( left.compare(right) >= 0 ) {
  19.             carry++;
  20.             left = left - right;
  21.         }
  22.         right.digits.erase(right.digits.begin());
  23.         result.digits.push_back(carry);
  24.     }
  25.     reverse(result.digits.begin(), result.digits.end());
  26.     if (result.digits[result.digits.size()-1] == 0)
  27.         result.digits.pop_back();
  28.     return result;
  29. }

幂运算:

点击(此处)折叠或打开

  1. very_long_int very_long_int::pow(unsigned int exp) const {
  2.     assert(!isZero());
  3.     very_long_int result;
  4.     result.digits.push_back(1);
  5.     very_long_int base = *this;

  6.     while (exp) {
  7.         if (exp & 0x1)
  8.             result = result * base;
  9.         exp = exp >> 1;
  10.         base = base * base;
  11.     }
  12.     return result;
  13. }

测试数据:
我是用python生成的,每中25组测试。

源码:

阅读(352) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~