首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ Builder >

学习CB泛型编程风格时碰到的奇怪有关问题,请各位帮忙看看

2012-02-22 
学习CB泛型编程风格时碰到的奇怪问题,请各位大虾帮忙看看!EssentialC++书上的一个例子程序如下,即用find()

学习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的方法编译已经通过 也完成你的功能

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

热点排行