首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >矢量上具有宏累积的模板函数

矢量上具有宏累积的模板函数
EN

Stack Overflow用户
提问于 2012-09-05 18:40:00
回答 1查看 1.9K关注 0票数 3

我想要创建一个函数,让vector<int>运行他所有的元素,并根据我选择的特定运算符对它们进行“和”。

例如,v1 = [3,6,7],所以我可以用这个函数来计算- 3+6+7 of 3-6-7 of 3*6*7等。

为此我做了-

代码语言:javascript
复制
#include <iostream>
#include <vector>

using namespace std;

#define     OPERATOR(X,Y,OP)  X #OP Y

template<T>
int allVectorWithOperator(vector<int> &myVector, T) {
    vector<int>::iterator it;
    vector<int>::iterator oneBeforeFinal;
    oneBeforeFinal = myVector.end();
    oneBeforeFinal -= 2;
    int sum = 0;
    for (it = myVector.begin(); it <= oneBeforeFinal; it++) {
        sum = OPERATOR(*(it),*(it+1),T);
    }
    return sum;

}

int main() {
    vector<int> myVector;
    myVector.push_back(3);
    myVector.push_back(6);
    myVector.push_back(7);
cout << "run over all the vector with * is :" << allVectorWithOperator(myVector,*)<<endl;
// here I want to get 3*6*7    

}

在这种模板情况下,我控制得不太好,所以正如您所看到的,这段代码不起作用,但我认为您明白我的目标是什么。我怎么才能修好它才能正常工作呢?

编辑:

根据我得到的2个答案,我把代码部分改为-

代码语言:javascript
复制
#include <iostream>
#include <vector>
#include <numeric>

using namespace std;

template<typename T>
int allVectorWhitOperator(vector<int> &myVector, const T& func) {
    int sum = std::accumulate(myVector.begin(), myVector.end(), 1, func);
    return sum;

}

int main() {
    vector<int> myVector;
    myVector.push_back(3);
    myVector.push_back(4);
    myVector.push_back(6);
    cout << "accumulate the vector with * is :"
            << allVectorWhitOperator(myVector, std::multiplies<int>()) << endl;

}

而且效果很好!确实是我got accumulate the vector with * is :72

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-09-05 18:52:08

std::accumulate。假设向量不是空的,您可以将函数重写为:

代码语言:javascript
复制
template <typename C, typename F>
typename C::value_type fold(const C& container, const F& function) {
    typename C::iterator cur = container.begin();
    typename C::value_type init = *cur++;
    return std::accumulate(cur, container.end(), init, function);
}

...

int sum = fold(myVector, std::plus<int>());
int difference = fold(myVector, std::minus<int>());
int product = fold(myVector, std::multiplies<int>());

现在,关于您的实现:

  1. 如上例所示,要在模板中声明类型参数,需要使用typenameclass关键字:template <typename T> int allVectorWithOperator( ... )
  2. 一个单独的*将不是一个有效的语法。但是C++提供了许多“函数对象”,这些对象用于包装这些操作符,这样您就可以在函数表示法中使用它们。例如, 乘积f;// f是将2个数乘积= f(5,7);// p == 35; 这样你就可以写: 模板int allVectorWithOperator(向量和肌向量,T函数){.对于(it = myVector.begin();it != oneBeforeFinal;++ it) { sum = func(*it,*(it+1));} (1)通常比较迭代器与!=,而不是<=,因为许多迭代器不支持<=算子,(2) ++it一般比it++更有效。
  3. 宏和模板在不同的阶段进行处理。特别是,不能将模板或函数参数传递给宏,因为在考虑模板时,所有宏都已经进行了评估。要实现语法,必须将整个allVectorWithOperator编写为宏,例如(假设可以使用C++11 ): #定义allVectorWithOperator(容器,binaryOp) \ (& -> {\auto&c=(容器);\ auto = c.begin();\ auto = *cur++;\ auto = c.end();\ while (cur != end) { val binaryOp##= *cur++;}\返回val;() 是的,这是一个完全混乱,所以你应该不喜欢使用宏,如果可能的话。顺便说一下,#OP的意思是将OP转换成字符串。你真的不需要#
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12287768

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档