C++ generic tools -- from C++ Standard Library

  今晚学了一下C++标准程序库, 来简单回顾和总结一下。

  1.pair 结构体

// defined in <utility> , in the std namespace
namespace std{
    template <class T1, class T2>
    struct pair{
        // type names for the values
        typedef T1 first_type;
        typedef T2 second_type;

        // member
        T1 first;
        T2 second;

        // default constructor
        // implicit invoke the built-in types to provide a default value
        pair():first(T1()),second(T2()){
        }

        // constructor for two default values
        pair(const T1& a,const T2& b)
            : first(a), second(b){
        }

        // copy constructor with implicit conversions,使用模板是因为构造过程中可能需要隐式类型转换。
        template<class U,class V>
        pair(const pair<U,V>& p)
            : first(p.first), second(p.second){
        }
    };

    //comparisions
    template <class T1,class T2>
    bool operator == (const pair<T1,T2>&, const pair<T1,T2>&);
    template <class T1,class T2>
    bool operator < (const pair<T1,T2>&,const pair<T1,T2>&);
    // similar : != . <, = , >
    template <class T1,class T2>
    pair<T1,T2> make_pair(const T1&,const T2&);
}

 2. make_pair(): 使你无需写出型别,就可以生成一个pair对象.

namespace std{
    //create value pair only by providing the values.
    template <class T1,class T2>
    pair<T1,T2> make_pair(const T1& x,constT2& y){
        return pair<T1,T2>(x,y);
    }
}

可以使用 std::make_pair(41,‘@‘); 而不用写成: std::make_pair<int,char>(42,‘@‘);

3. 智能指针 auto_ptr

  为什么要使用智能指针? 

    如果一开始获取的资源被绑定到局部对象上,当函数退出时,对象的析构函数会被调用, 从而释放资源。 会出现2个常见的问题:

      1.经常忘记delete操作

      2.当函数出错返回时,可能还没有执行delete

      可以使用捕捉所有异常来解决,然后在最后执行delete操作。 但是比较繁琐!不是优良的出现风格,而且复杂易出错。

  智能指针的作用: 保证无论在何种情况下, 只要自己被摧毁, 就一定连带释放其所指的资源; 由于智能指针本身就是局部变量,所以无论是正常退出还是异常退出, 只要函数退出,这个局部变量就会被销毁。 这也说明了,局部对象虽然也会摧毁, 但是其绑定的资源仍然没有得到释放。

  智能指针的定义: auto_ptr是这样的指针,它是所指向对象的owner!而且是唯一owner, 一个对象只能对应一个智能指针。

  智能指针被定义在头文件<memory>

  智能指针声明:  std::auto_ptr<ClassA> ptr(new ClassA);  使用了auto_ptr 之后就不需要使用catch和delete了。

  智能指针的访问: 类似一般指针,有 *, -> 和 = 操作, 但是不允许将普通指针直接赋值给 auto_ptr

  智能指针的拥有权关系:

    => 转让: 通过auto_ptr 的copy constructor 来交接拥有权。这种方式使得赋值操作改变了source 变量, 违反了STL对容器元素的要求,所以auto_ptr不允许作为STL的容器元素。

std::auto_ptr<ClassA> ptr1(new ClassA);
std::auto_ptr<ClassA> ptr2(ptr1);  // if ptr2 binded another obj, it will be deleted before. then ptr1 is a null pointer!

  auto_ptr的用法:(来源于拥有权转让的特殊用法)

    (1) 某函数是auto_ptr 的起点: 必须将拥有权传递出去,否则就会在函数退出时被删除, 这里是数据的起点。

    (2) 某函数是auto_ptr 的终点: 如果不需要再使用auto_ptr, 就不用传递出去即可, 会被自动删除。

  上面是auto_ptr的值传递, 如果是引用传递和const类型的呢?

  by reference: 通过reference传递时,无法知道拥有权是否被转移, 所以这种方式的设计不推荐。

  by const: 无法变更控制权(但可以修改对象属性), 安全性增强, 在STL中很多接口需要内部拷贝都通过const reference。

  使用auto_ptr需要注意:

    (1) auto_ptr 对象之间不能共享所有权。

    (2) auto_ptr 没有针对array而设计, 因为使用delete , 而没有delete[]。

    (3) auto_ptr 只用当拥有对象的智能指针被销毁时, 对象才会被销毁。

    (4) auto_ptr 不满足STL容器对元素的要求。

时间: 2024-10-11 06:21:56

C++ generic tools -- from C++ Standard Library的相关文章

Beyond the C++ Standard Library中文版pdf

下载地址:网盘下载 内容简介  · · · · · · Introducing the Boost libraries: the next breakthrough in C++ programming Boost takes you far beyond the C++ Standard Library, making C++ programming more elegant, robust, and productive. Now, for the first time, a leading

boost::bind实践2——来自《Beyond the C++ Standard Library ( An Introduction to Boost )》

直接代码: 代码段1: 1 #include <iostream> 2 #include <string> 3 #include <boost/bind/bind.hpp> 4 5 class some_class 6 { 7 public: 8 typedef void result_type; 9 void print_string(const std::string& s) const 10 { std::cout << s <<

boost::function实践——来自《Beyond the C++ Standard Library ( An Introduction to Boost )》

代码段1: 1 #include <boost/function.hpp> 2 #include <iostream> 3 4 5 float mul_ints(int x, int y) { return ((float)x) * y; } 6 struct int_div { 7 float operator()(int x, int y) const { return ((float)x)/y; }; 8 }; 9 10 int main() 11 { 12 boost::f

[RK_2014_1024][C++_01]C++ Standard Library

1 Standard headers 1.1 Containers 1.2 General 1.3 Localization 1.4 Strings 1.5 Streams and Input/Output 1.6 Language support 1.7 Thread support library 1.8 Numerics library 1.9 C standard library 2.本文网址[tom-and-jerry发布于2014-10-24 14:23] http://www.cn

C++学习书籍推荐《The C++ Standard Library 2nd》下载

百度云及其他网盘下载地址:点我 编辑推荐 经典C++教程十年新版再现,众多C++高手和读者好评如潮 畅销全球.经久不衰的C++ STL鸿篇巨著 C++程序员案头必 备的STL参考手册 全面涵盖C++11新标准 名人推荐 在C++的著作当中,这本书的地位是无可替代的.要成为合格的C++开发者,就必须掌握C++标准库,而要掌握C++标准库,这本书可以说是不二法门.这本书最了不起的地方,就在于面对庞大复杂的C++标准库,能够抽丝剥茧,化难为易,引导读者循序渐进,深入浅出地掌握C++标准库. --孟岩 

C++, standard library

0. 1. Standard library header <algorithm> #include <algorithm> // for sort std::array<int,10> s = {5,7,2,8,6,1,9,0,3}; // initial an array std::sort(s.begin(), s.end()); // sort the array 原文地址:https://www.cnblogs.com/sarah-zhang/p/122937

Publish .net standard library with all it&#39;s dependencies?

Publish .net standard library with all it's dependencies? 回答1 At the time of writing, it looks like it's by design and there's quite some fuss and confusion about it, see logged issue on GitHub. Moreover, when publishing a NuGet package for project A

Python Tutorial学习(十一)-- Brief Tour of the Standard Library – Part II

11.1. Output Formatting 格式化输出 The repr module provides a version of repr() customized for abbreviated displays of large or deeply nested containers: >>> import repr >>> repr.repr(set('supercalifragilisticexpialidocious')) "set(['a',

一篇很好的解释了.Net Core, .Net Framework, .Net standard library, Xamarin 之间关系的文章 (转载)

Introducing .NET Standard In my last post, I talked about how we want to make porting to .NET Core easier. In this post, I’ll focus on how we’re making this plan a reality with .NET Standard. We’ll cover which APIs we plan to include, how cross-frame