• 标准模板库介绍(一)


    标准模板库包括三种泛型:容器、迭代器和算法。

    容器

    容器是一种包含多个元素的数据结构,这些元素通常具有相同的类型。容器的实现可以多种多样,然后真正具有实际应用意义的容器并不多,它们包含在STL中,这些容器有:deque、list、map、multimap、set、multiset、stack、queue、priority_queue以及vector。

    STL容器实现为模板类。大多数容器具有相同的操作方法,但是各自实现不同,比如默认构造器,复制构造器,析构器,empty(), max_size(), size(), swap(), operator=,另外,除了priority_queue容器,其他容器还包含六个关系运算符(<, <=, !=, ==, >=, >)。

    存储在容器内的类型可以是任意类型,但是这些类型必须支持默认构造器,析构器和复制运算。有些编译器可能还要求实现关系运算符重载,虽然程序用不到这些。当然,数据成员如果是指针的话,还必须实现复制构造和operator=函数,因为插入操作使用的是元素的副本而不是元素自身。

    迭代器

    迭代器用于引用存储在容器中的某个元素,所以它其实是一个指针。所以,通过迭代器可以访问容器中的元素并对元素进行某些操作。

    算法

    STL提供了大约70种泛型函数,这些泛型函数即算法,可以应用到STL容器以及数组上。

    函数对象

    函数调用操作符“()” 可以看成跟其他操作符一样,这样“()”操作符可以被重载。包含函数调用操作符定义的对象称为函数对象。函数对象的行为就跟函数一样。

    看一个具体的例子

    class square{
    public:
        square() {
        }
        double operator() (double x) {
            return x*x;
        }
    };

    这段代码中,square类定义中重载了函数调用操作符,实现对输入参数求平方并返回结果。

    调用代码如下

    double squaresum(square s, int n, int m) {
        double res = 0;
        if( n <= m) 
        for(int i = n; i <= m; i++)   res
    += s(i); return res; }

    以上代码中,给函数对象传入一个输入参数,这个参数将会使函数调用操作符的输入参数。

    当然也可以不重载函数调用操作符,如下代码所示

    class square {
    public:
        square() {
        }
        double eval (double x) {
            return x*x;
        }
    };

    调用代码则为

    double squaresum (square s, int n, int m) {
        double res = 0;
        if (n <= m) 
            for (int i = n; i <= m; i++)
                res += s.eval(i);
        return res;
    }

    测试代码为

    cout << squaresum(square(), 1, 3) <<endl;

    注意:这里测试代码要求square类实现自定义构造函数,这样square()可以构造一个函数对象。

    STL中自带有一些函数对象。

    unary_function

    标准一元函数对象的基类,在一元函数对象中,operator()只能有一个参数。

    unary_function是基类,它没有定义operator()方法,而是有派生类来实现。unary_function的定义为  

    template <class Arg, class Result>
    struct unary_function {
        typedef Arg argument_type;
        typedef Result result_type;
    };  

    下面给出一个简单的例子来说明用法

    // unary_function example
    #include <iostream>     // std::cout, std::cin
    #include <functional>   // std::unary_function
    
    template<class IN, class OUT>
    struct IsOdd : public std::unary_function<IN, OUT> {
      bool operator() (IN number) {return (number%2!=0);}
    };
    
    int main () {
      IsOdd<int, bool> IsOdd_object;
      IsOdd<int, bool>::argument_type input; 
      IsOdd<int, bool>::result_type result; 
      std::cout << "Please enter a number: ";
      std::cin >> input; 
      result = IsOdd_object (input); 
      std::cout << "Number " << input << " is " << (result?"odd":"even") << ".
    ";
      return 0;
    }
  • 相关阅读:
    LN : leetcode 283 Move Zeroes
    LN : Eden Polymorphic And OOP Design Pattern Abstract Factory
    LN : leetcode 242 Valid Anagram
    LN : leetcode 231 Power of Two
    LN : leetcode 191 Number of 1 Bits
    LN : leetcode 263 Ugly Number
    LN : leetcode 258 Add Digits
    LN : leetcode 292 Nim Game
    day5——Python整型、浮点型、布尔型及字符串
    day4——Python运算符
  • 原文地址:https://www.cnblogs.com/sjjsxl/p/5021834.html
Copyright © 2020-2023  润新知