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

时间:2017-02-24 17:38:36

标签: c++ 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());
}

2 个答案:

答案 0 :(得分:0)

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

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];
    }
}

有关模板及其使用的更多详情,请参阅An Idiot's Guide to C++ Templates - Part 1An Idiot's Guide to C++ Templates - Part 2

答案 1 :(得分:0)

  

函数的逻辑独立于它是对象的向量,对象的原始指针还是唯一/弱/共享指针。

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

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);

请参阅Live Demo