【STL源码剖析】--error: ‘power’ was not declared in this scope

#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

特别注意:using namespace __gnu_cxx;不可少,因为头文件/usr/lib/gcc/i686-redhat-linux/4.4.6/../../../../include/c++/4.4.6/ext/numeric中有一句_GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx),需要使用__gnu_cxx命名空间。

正确代码:

//#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;
}

再次编译运行

时间: 2024-10-29 19:10:26

【STL源码剖析】--error: ‘power’ was not declared in this scope的相关文章

STL源码剖析 — 空间配置器(allocator)

前言 以STL的实现角度而言,第一个需要介绍的就是空间配置器,因为整个STL的操作对象都存放在容器之中. 你完全可以实现一个直接向硬件存取空间的allocator. 下面介绍的是SGI STL提供的配置器,配置的对象,是内存.(以下内容来自<STL源码剖析>) 空间配置器的标准接口 根据STL的规范,allocator的必要接口 各种typedef 1 allocator::value_type 2 allocator::pointer 3 allocator::const_pointer 4

STL 源码剖析 stl_numeric.h

本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie 描述.源码.示例 version 1:普通操作版本 version 2: 泛化操作版本 1.accumulate 描述:计算 init 和 [first, last) 内所有元素的总和 源码: //version 1 template <class InputIterator, class T> T accumulate(InputIterator first, InputIterato

《STL源码剖析》---stl_numeric.h阅读笔记

stl_numeric.h里面的都是数值算法,与数值计算有关. G++ 2.91.57,cygnus\cygwin-b20\include\g++\stl_numeric.h 完整列表 /* * * Copyright (c) 1994 * Hewlett-Packard Company * * Permission to use, copy, modify, distribute and sell this software * and its documentation for any pu

《STL源码剖析》---stl_pair.h阅读笔记

pair是STL中的模板类型,它可以存储两个元素,它也被称作"对组".在map中已经用到了它,pair其实就是一个struct结构,存有两个public的元素,重载了几个运算符,没有什么成员函数,源代码很简单. G++ 2.91.57,cygnus\cygwin-b20\include\g++\stl_pair.h 完整列表 /* * * Copyright (c) 1994 * Hewlett-Packard Company * * Permission to use, copy,

《STL源码剖析》---stl_tree.h阅读笔记

STL中,关联式容器的内部结构是一颗平衡二叉树,以便获得良好的搜索效率.红黑树是平衡二叉树的一种,它不像AVL树那样要求绝对平衡,降低了对旋转的要求,但是其性能并没有下降很多,它的搜索.插入.删除都能以O(nlogn)时间完成.平衡可以在一次或者两次旋转解决,是"性价比"很高的平衡二叉树. RB-tree(red black tree)红黑树是平衡二叉树.它满足一下规则 (1)每个节点不是红色就是黑色. (2)根节点是黑色. (3)如果节点为红色,则其子节点比为黑色. (4)任何一个节

《STL源码剖析》---stl_iterator.h阅读笔记

STL设计的中心思想是将容器(container)和算法(algorithm)分开,迭代器是容器(container)和算法(algorithm)之间的桥梁. 迭代器可以如下定义:提供一种方法,能够依序寻访某个容器内的所有元素,而又无需暴露该容器的内部表达方式. 在阅读代码之前,要先了解一个新概念:Traits编程技法 template <class T> struct MyIter { typedef T value_type //内嵌型别声明 T *ptr; MyIter(T *p = 0

STL 源码剖析 算法 stl_algo.h -- search_n

本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie search_n ---------------------------------------------------------------------------------------- 描述:在序列[first, last) 所涵盖的区间中,查找"连续 count 个符合条件之元素"所形成的子序列, 并返回迭代器 last 思路: 1.首先找出 value 第一次出现点

STL 源码剖析 算法 stl_algo.h -- lower_bound

本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie lower_bound(应用于有序区间) -------------------------------------------------------------------------------------------------------------------------- 描述:二分查找,返回一个迭代器指向每一个"不小于 value "的元素, 或 value 应该

STL 源码剖析 算法 stl_algo.h -- upper_bound

本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie upper_bound(应用于有序区间) ------------------------------------------------------------------------------------------------------------------------------------------------- 描述:受STL区间前闭后开习惯的影响,upper_boun

STL 源码剖析 算法 stl_algo.h -- binary_search

本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie binary_search ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ 描