STL-标准模板库

04-23 1420阅读

STL的诞生

  • 长久以来,软件界一直希望建立一种可重复利用的东西
  • c++的面向对象和泛型编程思想,目的就是复用性的提升
  • 大多数情况下,数据结构和算法都未能有一套标准,导致被迫从事大量重复工作
  • 为了建立数据结构和算法的一套标准,诞生了STL

    STL基本概念

    • STL(Standard Template Library)标准模板库
    • STL 从广义上分为:容器(container)、算法(algorithm)、迭代器(iterator)
    • 容器和算法之间通过迭代器进行无缝连接
    • STL几乎所有的代码都采用了模板类或者模板函数

      STL六大组件

      六大组件分别是:容器、算法、迭代器、仿函数、适配器(配接器)、空间配置器

      1. 容器:各种数据结构,如 vector、list、deque、set、map 等,用来存放数据
      2. 算法:各种常用的算法,如 sort、find、copy、for_each 等
      3. 迭代器:扮演了容器与算法之间的胶合剂
      4. 仿函数:行为类似函数,可作为算法的某种策略
      5. 适配器:一种用来修饰容器或者仿函数或迭代器接口的东西
      6. 空间配置器:负责空间的配置与管理

      String 容器

      基本概念

      本质

      STL-标准模板库

      • string 是 C++ 风格的字符串,而 string 本质上是一个类

        string 和 char* 区别

        • char* 是一个指针,通过这个指针管理一连串的 char 类型的空间
        • string 是一个类,类内部封装了 char*,管理这个字符串,是一个 char* 类型的容器

          特点

          string 类内部封装了很多成员方法

          例如:查找 find,拷贝 copy,删除 delete,替换 replace,插入 insert

          string 管理 char* 所分配的内存,不用担心复制越界和取值越界等问题,这些问题由类内部进行负责

          构造函数

          #include 
          #include 
          using namespace std;
          void test()
          {
          	string s1;	// 背后会调用默认的构造函数
          	const char* s2 = "hello world";		// C语言风格的字符串
          	string s3(s2);	// 背后会调用拷贝构造函数
          	cout 
          	string s1;
          	s1 = "hello world";
          	cout 
          	test();
          }
          
          	string s1 = "我";
          	s1 += "爱唱歌";		// 追加字符串
          	s1 += 'a';			// 追加一个字符
          	string s2 = "666";
          	s1 += s2;
          	string s3 = "I";
          	s3.append(" Love ");
          	s3.append("game abcde", 4);		// 只追加前面4个字符
          	cout 
          	test();
          }
          
          	for (vector
          		cout 
          	// 容器1
          	vector
          		v1.push_back(i);
          	}
          	printVector(v1);		// 0 1 2 3 4 5 6 7 8 9
          	// 容器2
          	vector
          		v2.push_back(i);
          	}
          	printVector(v2);		// 10 9 8 7 6 5 4 3 2 1
          	// 交换容器
          	/*
          		v1 指向 容器1
          		v2 指向 容器2
          		------------
          		交换容器之后
          		------------
          		v1 指向 容器2
          		v2 指向 容器1
          	*/
          	v1.swap(v2);
          	printVector(v1);		// 10 9 8 7 6 5 4 3 2 1
          	printVector(v2);		// 0 1 2 3 4 5 6 7 8 9
          }
          void test2()
          {
          	// 交换容器的实际应用:巧用swap可以收缩空间内存
          	// 1. 创建一个vector容器
          	vector
          		v.push_back(i);
          	}
          	cout 
          	test1();
          	test2();
          }
          
          	for (deque
          		cout 
          	deque
          	test();
          }
          
          	for (list
          		cout 
          	// 创建list容器,并存入数据
          	list
          		cout 
          		cout 
          	test();
          }
          
          	for (list
          		cout 
          	list
          	test();
          }
          
          	for (map
          		cout 
          	// 默认构造
          	map
          	test();
          }
          
          	for (map
          		cout 
          	// 创建map容器
          	map
          		cout 
          		cout 
          	test();
          }
          
          	cout 
          public:
          	void operator()(int val)
          	{
          		cout 
          	// 创建容器
          	vector
          		v.push_back(i);
          	}
          	// 遍历数据
          	for_each(v.begin(), v.end(), print);
          	for_each(v.begin(), v.end(), MyPrint());		// MyPrint() -- 匿名函数对象
          }
          int main()
          {
          	test();
          }
          

VPS购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]