#include <numeric>
#include <vector>
#include <iterator>
#include <iostream>
using namespace std;
int main(int argc, char **argv)
{
int iArray[5] = {1, 2, 3, 4, 5};
vector<int> iVect(iArray, iArray+5);
cout << accumulate(iVect.begin(), iVect.end(), 0) << endl;
cout << accumulate(iVect.begin(), iVect.end(), 0, minus<int>()) << endl;
cout << inner_product(iVect.begin(), iVect.end(), iVect.begin(), 10) << endl;
cout << inner_product(iVect.begin(), iVect.end(), iVect.begin(), 10, minus<int>(), plus<int>()) << endl;
ostream_iterator<int> oIter(cout, " ");
partial_sum(iVect.begin(), iVect.end(), oIter);
cout << endl;
partial_sum(iVect.begin(), iVect.end(), oIter, minus<int>());
cout << endl;
adjacent_difference(iVect.begin(), iVect.end(), oIter);
//1 1 1 1 1(#1元素照录, #n新元素等于 #n 旧元素 - #n-1 旧元素 )
cout << endl;
adjacent_difference(iVect.begin(), iVect.end(), oIter, plus<int>());
//1 3 5 7 9(#1元素照录, #n新元素等于 op(#n 旧元素, #n-1 旧元素) )
cout << endl;
cout << power(10, 3) << endl; ///usr/lib/gcc/i686-redhat-linux/4.4.6/../../../../include/c++/4.4.6/ext/numeric中有
cout << power(10, 3, plus<int>()) << endl;
int n = 3;
iota(iVect.begin(), iVect.end(), n);
for(int i = 0; i < iVect.size(); i++) {
cout << iVect[i] << " ";
}
cout << endl;
}
主要原因:
虽然GCC编译器完美集成了SGI STL,但是在使用GCC编译器编译使用SGI STL的源码时,需要注意:如iota、power等函数是非C++标准的函数,是SGI专属的函数,对于这类函数需要修改包含的头文件,这类头文件一般位于ext目录下,例如:numeric头文件位于/usr/lib/gcc/i686-redhat-linux/4.4.6/../../../../include/c++/4.4.6/目录下,而扩展的numeric则位于/usr/lib/gcc/i686-redhat-linux/4.4.6/../../../../include/c++/4.4.6/ext/目录下。因此,上述代码的头文件改为:
#include <ext/numeric> //For iota, already #include <numeric> #include <vector> #include <iterator> #include <iostream> using namespace std; using namespace __gnu_cxx; //For power iota
正确代码:
//#include <ext/functional> // For identity_element
#include <ext/numeric> //For iota, already #include <numeric>
#include <vector>
#include <iterator>
#include <iostream>
using namespace std;
using namespace __gnu_cxx; //For power iota
int main(int argc, char **argv)
{
int iArray[5] = {1, 2, 3, 4, 5};
vector<int> iVect(iArray, iArray+5);
cout << accumulate(iVect.begin(), iVect.end(), 0) << endl;
cout << accumulate(iVect.begin(), iVect.end(), 0, minus<int>()) << endl;
cout << inner_product(iVect.begin(), iVect.end(), iVect.begin(), 10) << endl;
cout << inner_product(iVect.begin(), iVect.end(), iVect.begin(), 10, minus<int>(), plus<int>()) << endl;
ostream_iterator<int> oIter(cout, " ");
partial_sum(iVect.begin(), iVect.end(), oIter);
cout << endl;
partial_sum(iVect.begin(), iVect.end(), oIter, minus<int>());
cout << endl;
adjacent_difference(iVect.begin(), iVect.end(), oIter);
//1 1 1 1 1(#1元素照录, #n新元素等于 #n 旧元素 - #n-1 旧元素 )
cout << endl;
adjacent_difference(iVect.begin(), iVect.end(), oIter, plus<int>());
//1 3 5 7 9(#1元素照录, #n新元素等于 op(#n 旧元素, #n-1 旧元素) )
cout << endl;
cout << power(10, 3) << endl; ///usr/lib/gcc/i686-redhat-linux/4.4.6/../../../../include/c++/4.4.6/ext/numeric中
cout << power(10, 3, plus<int>()) << endl;
int n = 3;
iota(iVect.begin(), iVect.end(), n);
for(int i = 0; i < iVect.size(); i++) {
cout << iVect[i] << " ";
}
cout << endl;
}再次编译运行
【STL源码剖析】--error: ‘power’ was not declared in this scope
原文地址:http://blog.csdn.net/hero06206/article/details/45726065