📜  c++ 向量扩展向量 - C++ (1)

📅  最后修改于: 2023-12-03 15:13:59.651000             🧑  作者: Mango

C++ 向量扩展向量

在C++中,向量是一种非常常用的数据结构,常常用于存储、访问和操作一组数据。向量就是一个动态数组,它可以随时增加或缩小容量,因此非常适合需要频繁插入或删除元素的场合。在本文中,我们将介绍如何扩展C++向量的功能,使其更加强大和灵活。

原生向量

我们先来看一下C++原生向量的使用方法:

#include <iostream>
#include <vector>

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

    for (int i = 0; i < myVector.size(); i++) {
        std::cout << myVector[i] << " ";
    }
    return 0;
}

上述代码中,我们定义了一个整型向量myVector,并使用push_back()方法将元素1、2、3插入到向量中。然后我们通过for循环遍历整个向量,并输出每一个元素。

运行此程序,将会输出如下结果:

1 2 3

对于简单的需求,C++原生向量已经非常好用了。但是在复杂的场景下,我们可能需要更多的功能来满足要求。接下来,我们将介绍如何扩展C++向量的功能。

向量扩展
1. 过滤器

有时候我们需要从一个向量中筛选出符合某个条件的元素。这时候,我们可以定义一个过滤器,过滤掉不符合条件的元素,只保留符合条件的元素。下面是一个示例:

#include <iostream>
#include <vector>

template <class T>
std::vector<T> filter(std::vector<T> v, bool (*predicate)(T)) {
    std::vector<T> result;
    for (T item : v) {
        if (predicate(item)) {
            result.push_back(item);
        }
    }
    return result;
}

bool isOdd(int n) {
    return n % 2 == 1;
}

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

    std::vector<int> result = filter(myVector, isOdd);

    for (int i = 0; i < result.size(); i++) {
        std::cout << result[i] << " ";
    }
    return 0;
}

上述代码中,我们定义了一个filter()函数,这个函数接受两个参数:要过滤的向量和一个predicate函数。predicate函数返回truefalse,表示一个元素是否符合条件。filter()函数会遍历整个向量,对每个元素调用predicate()函数,如果返回true,则将这个元素加入到结果向量中。

main()函数中,我们先构造一个包含1、2、3三个元素的向量,然后调用filter()函数,传入了一个名为isOdd的函数作为predicate参数,这个函数用来判断一个数是否是奇数。结果向量中只会包含所有奇数,因此输出结果是:

1 3
2. 转换器

除了过滤掉不符合条件的元素外,有时候我们还需要对一组元素进行转换。例如,将一个字符串向量中所有的元素转换为整型。下面是一个示例:

#include <iostream>
#include <vector>
#include <string>
#include <sstream>

template <class T, class U>
std::vector<U> map(std::vector<T> v, U (*mapper)(T)) {
    std::vector<U> result;
    for (T item : v) {
        result.push_back(mapper(item));
    }
    return result;
}

int toInt(std::string s) {
    std::istringstream iss(s);
    int n;
    iss >> n;
    return n;
}

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

    std::vector<int> result = map(myVector, toInt);

    for (int i = 0; i < result.size(); i++) {
        std::cout << result[i] << " ";
    }
    return 0;
}

上述代码中,我们定义了一个map()函数,这个函数接受两个参数:要转换的向量和一个mapper函数。mapper函数接受一个元素,返回一个转换后的对象。在map()函数中,我们遍历整个向量,对每个元素调用mapper()函数,将返回值加入到结果向量中。

main()函数中,我们先构造一个包含字符串“1”、“2”、“3”的向量,然后调用map()函数,传入了一个名为toInt的函数作为mapper参数,这个函数将一个字符串转换为整型。结果向量中将包含整型1、2、3,因此输出结果是:

1 2 3
3. 对象列表

有时候我们需要存储一组对象,而不是简单的整数或字符串。这时候,我们可以定义一个对象列表:一个向量,其中的每个元素都是一个对象。下面是一个示例:

#include <iostream>
#include <vector>
#include <string>

class Person {
public:
    std::string name;
    int age;

    Person(std::string name, int age) : name(name), age(age) {}
};

int main() {
    std::vector<Person> myVector;
    myVector.push_back(Person("Tom", 20));
    myVector.push_back(Person("John", 30));
    myVector.push_back(Person("Mary", 25));

    for (int i = 0; i < myVector.size(); i++) {
        std::cout << myVector[i].name << " " << myVector[i].age << std::endl;
    }
    return 0;
}

上述代码中,我们定义了一个名为Person的类,这个类有两个成员变量:nameage。然后我们构造了一个包含三个Person对象的向量,每个对象都包含一个姓名和一个年龄。在for循环中,我们遍历整个向量,输出每个对象的姓名和年龄。

输出结果是:

Tom 20
John 30
Mary 25
结论

在本文中,我们介绍了如何扩展C++向量的功能,包括过滤器、转换器和对象列表。这些功能可以让我们更加灵活地操作向量,满足各种复杂的需求。在实际项目中,我们可以根据需要,自由地扩展向量的功能,以适应不同的场景。