独立于元素内存管理的向量上的函数
Function on a vector independent on the element memory management
我正在实现一个对某些对象的向量进行操作的函数,假设为了简单起见,它计算了一个总和。
函数的逻辑与它是对象的向量、指向对象的原始指针还是唯一/弱/共享指针无关。
如何在不重复代码的情况下完成它,并且用户开销最小?
编辑:
该解决方案适用于不同的指针,但不适用于对象。好吧,也许除了在任何地方使用指针并强制用户创建指针向量之外没有办法,如果他想使用该功能。至少比相反更容易。
如果可能的话,我想以某种方式保留我的对象类型,因为我对它很满意。 现在,我被迫使用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);
请参阅现场演示。
相关文章:
- 写入向量<向量<bool>>
- 函数向量_指针有不同的原型,我可以构建一个吗
- 向量成员在管理类指针C++队列时丢失
- C++ 使用数组初始化时的 STL 向量内存管理
- 管理迭代器的容器(特别是列表的迭代器的向量)
- 如何管理STD ::功能的STD ::向量
- 独立于元素内存管理的向量上的函数
- 内存管理:返回一个向量元素并删除(pop_back)它
- C++内存管理:从函数中的向量创建一个新数组
- 管理模板化派生类型的向量集合
- 如何管理结构类型为XPoint的向量
- 将指针向量作为类成员进行管理
- 如何在一个向量中管理基类实例和派生类实例
- 如何使用二维大小范围较大的std::向量来管理结构的std::向量
- 尝试使用while循环取消分配向量,任务管理器显示内存使用正在增加
- 包含向量的指针列表的内存管理
- 向量的内存管理
- 数据结构向量的内存管理
- 面向对象向量的c++内存管理
- 可以使用std::vector capacity/size/rereserve手动管理向量内存分配吗