独立于元素内存管理的向量上的函数

Function on a vector independent on the element memory management

本文关键字:管理 向量 函数 内存 于元素 元素 独立      更新时间:2023-10-16

我正在实现一个对某些对象的向量进行操作的函数,假设为了简单起见,它计算了一个总和。

函数的逻辑与它是对象的向量、指向对象的原始指针还是唯一/弱/共享指针无关。

如何在不重复代码的情况下完成它,并且用户开销最小?


编辑:

该解决方案适用于不同的指针,但不适用于对象。好吧,也许除了在任何地方使用指针并强制用户创建指针向量之外没有办法,如果他想使用该功能。至少比相反更容易。

如果可能的话,我想以某种方式保留我的对象类型,因为我对它很满意。 现在,我被迫使用T,而不是玩家,小部件,矩阵或任何有意义的东西的向量。在这种情况下,我很想拥有类似template <class T extends MyLovelyClass>的东西,但这不是C++......

#include <vector>
#include <memory>
class A{
public:
int get(){return 1;}
};
template<typename T, typename Iterator>
int sum(Iterator begin, Iterator end) {
T result = {};
for(auto it = begin; it != end; ++it) {
result += (*it)->get();
}
return result;
}
int main(){
std::vector<A> v(10);
std::vector<A*> w(10);
std::vector<std::shared_ptr<A>> u(10);
for (int i = 0; i < w.size(); i++){
w[i] = new A();
}
for (int i = 0; i < u.size(); i++){
u[i] = std::make_shared<A>();
}
//sum<int>(v.begin(), v.end()); //doesn't work
sum<int>(w.begin(), w.end());
sum<int>(u.begin(), u.end());
}

您可以使用模板函数实现算法。这是给出的模板函数示例。

template<typename T>
return_type functionName(vector<T> var) {
// You can do this multiple way, First approach
T sum = T();
for(const auto& it: var) {
sum += it;
}
// 2nd Approach
for(int i = 0; i < var.size(); i++) {
sum += var[i];
}
}

有关模板及其使用的更多详细信息,请阅读C++模板白痴指南 - 第 1 部分和C++模板白痴指南 - 第 2 部分

函数的逻辑与它是对象的向量、指向对象的原始指针还是唯一/弱/共享指针无关。

惯用方法是将此类算法包装到模板函数中,该函数采用迭代器模板参数:

template<typename T, typename Iterator>
T sum(Iterator begin, Iterator end) {
T result = {};
for(auto it = begin; it != end; ++it) {
result += *it;
}
return result;
}

这里有几种使用它的方法

std::vector<int> v { 1, 2, 3, 4, 5 };
int sum1 = sum<int>(v.begin(),v.end());
std::array<int, 5> a { 1, 2, 3, 4, 5 };
int sum2 = sum<int>(a.begin(),a.end());
int ra[5] { 1, 2, 3, 4, 5 };
int sum3 = sum<int>(std::begin(ra),std::end(ra));
int* da = new int[5] { 1, 2, 3, 4, 5 };
int sum4 = sum<int>(da,da+5);

请参阅现场演示。