我想要创建一个函数,让vector<int>运行他所有的元素,并根据我选择的特定运算符对它们进行“和”。
例如,v1 = [3,6,7],所以我可以用这个函数来计算- 3+6+7 of 3-6-7 of 3*6*7等。
为此我做了-
#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个答案,我把代码部分改为-
#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
发布于 2012-09-05 18:52:08
std::accumulate。假设向量不是空的,您可以将函数重写为:
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>());现在,关于您的实现:
typename或class关键字:template <typename T> int allVectorWithOperator( ... )*将不是一个有效的语法。但是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++更有效。allVectorWithOperator编写为宏,例如(假设可以使用C++11 ):
#定义allVectorWithOperator(容器,binaryOp) \ (& -> {\auto&c=(容器);\ auto = c.begin();\ auto = *cur++;\ auto = c.end();\ while (cur != end) { val binaryOp##= *cur++;}\返回val;()
是的,这是一个完全混乱,所以你应该不喜欢使用宏,如果可能的话。顺便说一下,#OP的意思是将OP转换成字符串。你真的不需要#。https://stackoverflow.com/questions/12287768
复制相似问题