读书人

学习CB泛型编程风格时碰到的奇怪有关问

发布时间: 2012-02-22 19:36:56 作者: rapoo

学习CB泛型编程风格时碰到的奇怪问题,请各位大虾帮忙看看!
Essential C++书上的一个例子程序如下,即用find()函数返回一个任意容器类型中某一个元素的地址:


//让find()不仅可以处理整数,还可以处理任何型别
//----------------------------------

#include <vcl.h>
#include <vector>
#include <iostream.h>
#include <conio.h>
#pragma hdrstop

template <typename elemType>
elemType* __fastcall find( elemType *first, elemType *last, elemType value);

template <typename elemType>
inline elemType* __fastcall begin(vector <elemType> &vec);

template <typename elemType>
inline elemType* __fastcall end(vector <elemType> &vec);


//----------------------------------

#pragma argsused
int main(int argc, char* argv[])
{
char arr[8] = { '1 ', 'a ', '3 ', '4 ', '5 ', '6 ', '7 ', '8 '};
vector <char> vec(arr,arr + 8);
char value = 'a ';
char* p = 0;

cout < < "容器中 " < < vec.size() < < "个元素分别为: \n "; --死循环开始
for(int i = 0; i < vec.size() ; i++)
{
cout < < vec[i] < < " ";
}
cout < < "chulai ";

char* bp = begin(vec); --死循环末端

char* ep = end(vec);

p = find( begin(vec), end(vec), value); //调用查找函数
if( !p )
{
cout < < "指针返回 0 ,在容器中不存在这个元素 ";
getchar();
return 0;
}
cout < < "成功查找到元素 " < < *p;
getchar();
return 0;
}
//---------------------------------


//函数说明 寻找一个某类型值是否在容器内
//参数
//返回值 elemType
template <typename elemType>
elemType* __fastcall find( elemType *first, elemType *last, elemType value)
{
if( !first || !last )
return 0;

//当 first 不等于 last 时,就把 value 拿来和 first 所指的元素比较


//如果两者相等,便返回 first ,否则将 first 累加 1,令它指向下一个元素
for( ; first != last; ++first )
if( *first == value )
return first;
return 0;
}
//---------------------------------


//函数说明 向量vec如果为空,返回0,不为空则返回vec第一个元素的地址
//参数
//返回值 elemType
template <typename elemType>
inline elemType* __fastcall begin(vector <elemType> &vec)
{
return vec.empty()? 0 : &vec(0);
}
//--------------------------------


//函数说明 向量vec如果为空,返回0 ,不为空则返回vec最后一个元素的地址
//参数
//返回值 elemType
template <typename elemType>
inline elemType* __fastcall end(vector <elemType> &vec)
{
return vec.empty()? 0 : &vec(vec.size());
}
//---------------------------------

以上编译成功后执行时,发现在主程序处有一个奇怪的死循环,但是我百思不得其解,请各位帮忙看看

[解决办法]
先说一下:
find本身就支持各种类型的查询
你根本就不需要做别的处理

本身algorithm中的算法都是支持泛形编程的 包括functional里面的

对你的设计的问题:可以参考 vector的实现

另外

char arr[8] = { '1 ', 'a ', '3 ', '4 ', '5 ', '6 ', '7 ', '8 '};
vector <char> vec(arr,arr + 8);
char value = 'a ';
char* p = 0;

cout < < "容器中 " < < vec.size() < < "个元素分别为: \n "; //--死循环开始
for(int i = 0; i < vec.size() ; i++)
{
cout < < vec[i] < < " ";
}
cout < < "chulai ";
vector <char> ::iterator iter;
//char* bp = begin(vec); //--死循环末端
iter = vec.begin();

//char* ep = end(vec);

p = find( iter, vec.end(), value); //调用查找函数
if( p == vec.end() )
{
cout < < "指针返回 0 ,在容器中不存在这个元素 ";
getchar();
return 0;
}
cout < < "成功查找到元素 " < < *p;
getchar();
return 0;

通过上面的标准STL的方法编译已经通过 也完成你的功能

如果你要学习范型 你找错方向了

读书人网 >C++ Builder

热点推荐