天天看点

泛型编程与STL 第 五、六 章 Containers(容器)

作者:明政面朝大海春暖花开

泛型编程是一种编程范式,它强调以一种通用的方式编写代码,使其能适用于多种数据类型。C++标准模板库(STL)是一个广泛使用泛型编程的库,它提供了一组通用的数据结构和算法。

在STL中,函数对象是一种可被像函数一样调用的对象。它们是一种特殊的类对象,实现了函数调用运算符(operator()),使得它们可以像函数一样被调用。函数对象可以用于STL算法的参数,以提供自定义的行为。

函数对象配接器(Function Object Adapters)是一种用于修改或组合函数对象行为的工具。它们通过将一个函数对象适配到另一个函数对象上,实现了不同的功能。

以下是几个C++中的函数对象配接器的例子:

  1. std::bind:std::bind允许我们将函数对象与其参数进行绑定,创建一个新的函数对象。例如:
#include <iostream>
#include <functional>

void printSum(int a, int b) {
    std::cout << "Sum: " << a + b << std::endl;
}

int main() {
    auto sumFunc = std::bind(printSum, 10, std::placeholders::_1);
    sumFunc(20); // 输出:Sum: 30
    return 0;
}
           

在上面的例子中,我们使用std::bind将printSum函数与参数10进行绑定,创建了一个新的函数对象sumFunc。当我们调用sumFunc并传递参数20时,它会调用printSum函数并输出结果。

  1. std::function:std::function是一种通用的函数对象类型,可以用于存储和调用各种类型的函数对象。例如:
#include <iostream>
#include <functional>

int add(int a, int b) {
    return a + b;
}

int main() {
    std::function<int(int, int)> addFunc = add;
    std::cout << "Sum: " << addFunc(10, 20) << std::endl; // 输出:Sum: 30
    return 0;
}
           

在上面的例子中,我们使用std::function定义了一个函数对象addFunc,它可以存储和调用返回类型为int,接受两个int参数的函数。我们将add函数赋值给addFunc,并通过addFunc调用add函数并输出结果。

这些是C++中的一些函数对象配接器的例子。它们可以帮助我们更灵活地使用函数对象,并实现各种功能。请注意,这只是一小部分函数对象配接器的示例,STL中还有更多的函数对象配接器可供使用。

泛型编程是一种编程方法,它允许我们编写与特定数据类型无关的代码。在C++中,标准模板库(STL)是一种实现泛型编程的重要工具,它提供了许多预定义的函数对象(Function Objects),以便在算法和容器中使用。

函数对象是一种行为类似于函数的对象,它可以像函数一样被调用。在STL中,预定义的函数对象是可重用的,它们提供了一些常见的操作,如比较、算术运算等,以便在算法中使用。

下面是一个使用STL预定义的函数对象的示例:

#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    std::vector<int> numbers = {5, 2, 8, 1, 9};

    // 使用预定义的函数对象std::less进行排序
    std::sort(numbers.begin(), numbers.end(), std::less<int>());

    // 打印排序后的结果
    for (int number : numbers) {
        std::cout << number << " ";
    }

    return 0;
}
           

在上面的示例中,我们使用了std::sort算法对numbers向量进行排序。std::less是一个预定义的函数对象,它表示小于比较运算符(<)。通过将std::less作为第三个参数传递给std::sort,我们告诉它使用小于比较运算符进行排序。

当我们运行上面的代码时,输出将是:1 2 5 8 9,即按升序排序后的结果。

除了std::less,STL还提供了其他预定义的函数对象,如std::greater、std::plus、std::minus等,它们分别表示大于比较运算符(>)、加法运算符(+)、减法运算符(-)等。通过使用这些预定义的函数对象,我们可以方便地在泛型编程中执行各种操作。

泛型编程是一种编程范式,它允许我们编写与具体数据类型无关的代码。在C++中,标准模板库(STL)是一个广泛使用泛型编程的示例,它提供了一组通用的容器类和算法,用于处理不同类型的数据。

下面是一个使用STL中的容器类的简单示例:

#include <iostream>
#include <vector>

int main() {
    // 创建一个整数类型的vector容器
    std::vector<int> numbers;

    // 向容器中添加元素
    numbers.push_back(10);
    numbers.push_back(20);
    numbers.push_back(30);

    // 遍历容器中的元素并输出
    for (int i = 0; i < numbers.size(); ++i) {
        std::cout << numbers[i] << " ";
    }
    std::cout << std::endl;

    return 0;
}
           

在上面的示例中,我们使用了std::vector这个容器类来存储整数类型的数据。std::vector是一个动态数组,它可以根据需要自动调整大小。我们使用push_back函数向容器中添加元素,然后使用循环遍历容器中的元素,并使用std::cout输出它们。

这只是一个简单的示例,STL提供了许多其他的容器类,如std::list、std::map、std::set等,每个容器类都有其特定的用途和特点。此外,STL还提供了一组强大的算法,如排序、查找、遍历等,可以在容器上执行各种操作。

希望这个简单的示例能帮助你理解泛型编程和STL中的容器类的概念和用法。如果你有任何进一步的问题,请随时提问!

泛型编程是一种编程范式,它强调代码的通用性和复用性。在C++中,STL(标准模板库)是一个广泛使用的库,提供了一系列的容器和算法,用于处理各种数据结构和操作。

STL的容器是泛型的,意味着它们可以存储不同类型的数据。STL提供了多个容器类,包括vector、list、deque、set、map等。下面是一些关于STL容器和泛型编程的示例:

  1. 使用vector容器存储整数:
#include <iostream>
#include <vector>

int main() {
    std::vector<int> numbers;
    numbers.push_back(1);
    numbers.push_back(2);
    numbers.push_back(3);

    for (int i : numbers) {
        std::cout << i << " ";
    }

    return 0;
}
           

输出:1 2 3

  1. 使用map容器存储键值对:
#include <iostream>
#include <map>

int main() {
    std::map<std::string, int> ages;
    ages["Alice"] = 25;
    ages["Bob"] = 30;
    ages["Charlie"] = 35;

    for (auto pair : ages) {
        std::cout << pair.first << ": " << pair.second << std::endl;
    }

    return 0;
}
           

输出:

Alice: 25

Bob: 30

Charlie: 35

  1. 使用泛型算法对容器进行排序:
#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    std::vector<int> numbers = {3, 1, 4, 1, 5, 9, 2, 6, 5};

    std::sort(numbers.begin(), numbers.end());

    for (int i : numbers) {
        std::cout << i << " ";
    }

    return 0;
}
           

输出:1 1 2 3 4 5 5 6 9

以上示例展示了使用STL容器和泛型算法的基本用法。通过使用泛型编程和STL,你可以更加灵活和高效地处理不同类型的数据和操作。

泛型编程是一种编程范式,它允许编写可以适用于多种数据类型的通用代码。C++标准模板库(STL)是C++语言的一个重要组成部分,提供了一组通用的数据结构和算法,用于处理各种类型的数据。

在STL中,大小可变的容器是指可以动态添加或删除元素的容器。以下是一些常见的大小可变容器和使用泛型编程的示例:

  1. vector容器:vector是一个动态数组,可以根据需要自动调整大小。它提供了在数组末尾添加或删除元素的方法。例如,可以使用vector容器存储一组整数,并使用泛型编程来编写通用的函数来操作这些整数。
#include <vector>
#include <iostream>

template<typename T>
void printVector(const std::vector<T>& vec) {
    for (const auto& element : vec) {
        std::cout << element << " ";
    }
    std::cout << std::endl;
}

int main() {
    std::vector<int> numbers = {1, 2, 3, 4, 5};
    printVector(numbers); // 输出:1 2 3 4 5

    numbers.push_back(6);
    printVector(numbers); // 输出:1 2 3 4 5 6

    numbers.pop_back();
    printVector(numbers); // 输出:1 2 3 4 5

    return 0;
}
           
  1. list容器:list是一个双向链表,允许在任意位置插入或删除元素。可以使用泛型编程来编写通用的函数来操作list容器。
#include <list>
#include <iostream>

template<typename T>
void printList(const std::list<T>& lst) {
    for (const auto& element : lst) {
        std::cout << element << " ";
    }
    std::cout << std::endl;
}

int main() {
    std::list<double> numbers = {1.1, 2.2, 3.3, 4.4, 5.5};
    printList(numbers); // 输出:1.1 2.2 3.3 4.4 5.5

    numbers.push_back(6.6);
    printList(numbers); // 输出:1.1 2.2 3.3 4.4 5.5 6.6

    numbers.pop_front();
    printList(numbers); // 输出:2.2 3.3 4.4 5.5 6.6

    return 0;
}
           

这只是两个示例,STL还提供了许多其他大小可变的容器,如deque、set、map等。通过使用泛型编程,可以编写通用的代码来处理这些容器中的元素,而不需要为每种容器类型编写特定的代码。

泛型编程是一种编程范式,它允许我们编写能够处理多种数据类型的通用代码。C++的标准模板库(STL)是一个使用泛型编程的库,它提供了一系列容器和算法,用于处理各种数据结构和操作。

在STL中,大小可变的容器是一类非常重要的数据结构,它们可以根据需要动态地增加或减少元素。以下是一些大小可变容器的概念和相关的C++代码示例:

  1. Assignable(可赋值):这个概念表示容器中的元素可以被赋值。在C++中,大多数内置的数据类型和用户自定义的类都是可赋值的。例如,使用vector容器存储整数并进行赋值操作的示例代码如下:
#include <vector>

int main() {
    std::vector<int> numbers;
    numbers.push_back(1);
    numbers.push_back(2);
    
    numbers[0] = 3; // 赋值操作
    
    return 0;
}
           
  1. Default Comparable(默认可比较):这个概念表示容器中的元素可以进行默认的比较操作。在C++中,内置的数据类型和用户自定义的类都可以进行默认的比较操作。例如,使用set容器存储字符串并进行比较操作的示例代码如下:
#include <set>
#include <iostream>

int main() {
    std::set<std::string> names;
    names.insert("Alice");
    names.insert("Bob");
    
    if ("Alice" < "Bob") { // 比较操作
        std::cout << "Alice comes before Bob" << std::endl;
    }
    
    return 0;
}
           
  1. Equality Comparable(可相等比较):这个概念表示容器中的元素可以进行相等比较操作。在C++中,内置的数据类型和用户自定义的类都可以进行相等比较操作。例如,使用unordered_set容器存储整数并进行相等比较的示例代码如下:
#include <unordered_set>
#include <iostream>

int main() {
    std::unordered_set<int> numbers;
    numbers.insert(1);
    numbers.insert(2);
    
    if (numbers.find(1) != numbers.end()) { // 相等比较
        std::cout << "Number 1 exists in the set" << std::endl;
    }
    
    return 0;
}
           
  1. Ordering(可序性):这个概念表示容器中的元素可以进行排序操作。在C++中,内置的数据类型和用户自定义的类都可以进行排序操作。例如,使用list容器存储整数并进行排序操作的示例代码如下:
#include <list>
#include <algorithm>
#include <iostream>

int main() {
    std::list<int> numbers;
    numbers.push_back(3);
    numbers.push_back(1);
    numbers.push_back(2);
    
    numbers.sort(); // 排序操作
    
    for (const auto& number : numbers) {
        std::cout << number << " ";
    }
    
    return 0;
}
           

上述示例代码只是简单展示了使用STL中的一些大小可变容器的基本概念和操作。实际上,STL提供了更多的容器和算法,可以满足各种不同的需求。如果需要更详细的信息和更多示例,请参考相关的C++和STL文档或教程。

继续阅读