📅  最后修改于: 2023-12-03 15:13:59.651000             🧑  作者: Mango
在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++向量的功能。
有时候我们需要从一个向量中筛选出符合某个条件的元素。这时候,我们可以定义一个过滤器,过滤掉不符合条件的元素,只保留符合条件的元素。下面是一个示例:
#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
函数返回true
或false
,表示一个元素是否符合条件。filter()
函数会遍历整个向量,对每个元素调用predicate()
函数,如果返回true
,则将这个元素加入到结果向量中。
在main()
函数中,我们先构造一个包含1、2、3三个元素的向量,然后调用filter()
函数,传入了一个名为isOdd
的函数作为predicate
参数,这个函数用来判断一个数是否是奇数。结果向量中只会包含所有奇数,因此输出结果是:
1 3
除了过滤掉不符合条件的元素外,有时候我们还需要对一组元素进行转换。例如,将一个字符串向量中所有的元素转换为整型。下面是一个示例:
#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
有时候我们需要存储一组对象,而不是简单的整数或字符串。这时候,我们可以定义一个对象列表:一个向量,其中的每个元素都是一个对象。下面是一个示例:
#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
的类,这个类有两个成员变量:name
和age
。然后我们构造了一个包含三个Person
对象的向量,每个对象都包含一个姓名和一个年龄。在for
循环中,我们遍历整个向量,输出每个对象的姓名和年龄。
输出结果是:
Tom 20
John 30
Mary 25
在本文中,我们介绍了如何扩展C++向量的功能,包括过滤器、转换器和对象列表。这些功能可以让我们更加灵活地操作向量,满足各种复杂的需求。在实际项目中,我们可以根据需要,自由地扩展向量的功能,以适应不同的场景。