使用模版实现顺序查找和对分查找,遇到的问题:
1、class和typename的区别
- 声明模板参数时,class和typename关键字等价,可以互换;(早期的C++标准中,模版参数的关键字是通过class来标识的,后引入typename关键字。typename关键字本质上是标识一个类型,所以在模版参数定义时可以代替class。)
- 用作“嵌套依赖类型名”,必须用typename关键字标识;(例外:继承列表/成员初始化列表中的基类初始化时,可以不用typename标识“嵌套依赖类型名”,因为编译器能够根据上下程序识别某个字符串是类类型名称。)
template <typename T> void func(const T &container) { T::const_iterator *x; }
func函数中,变量x的类型依赖于模板参数T,它的具体类型只有在编译时,模板推导过程中才能被确定,这样的类型称为“嵌套依赖类型”(nested dependent type name)。
编译器不知道T::const_iterator是一个静态变量(做乘法),还是一个类型名(则声明变量x),故编译出错(error: ‘x‘ was not declared in this scope)。此时必须用typename显式告诉编译器T::const_iterator是一个类型。
参考:http://blog.csdn.net/swust_long/article/details/7006780
2、vector出现subscript out of range的问题
#include<iostream> #include<string> #include<vector> using namespace std; void main() { vector<string> a; //a.resize(2); // 1. 加这一行 //a[0]="aaaaaa"; //a[1]="xxxxxx"; a.push_back("aaaaaa"); // 2. 或者这么写 a.push_back("xxxxxx"); cout<<a.size()<<endl; }
直接定义a[0]、a[1]出错,因为对象a还没有分配空间,解决方法两种:
(1)使用resize分配对象a的空间;
(2)使用push_back添加元素。
模板实现查找算法(顺序查找和对分查找)
#include <iostream> #include <vector> #include <algorithm> using namespace std; template <typename T> bool SequentialSearchTemplate(vector<T> &array, T t) { int i = 0; while(i<array.size() && t!= array[i]) { ++i; } if (t == array[i]) { return true; } else { return false; } } template <typename T> bool BinarySearchTemplate(vector<T> &array, T t) { int low = 0; int high = array.size()-1; int mid; while(low <= high) { mid = (low+high)/2; if (t < array[mid]) { high = mid -1; } else if (t > array[mid]) { low = mid + 1; } else { return true; } } return false; } void BinarySearchTemplateTest() { vector<int> vec; for (int i=0; i<100; ++i) { vec.push_back(i); } bool res = SequentialSearchTemplate(vec, 29); cout << "search result for [29]: " <<res<<endl; res = SequentialSearchTemplate(vec, 16); cout << "search result for [16]: " <<res<<endl; vector<double> doubleVec; for (int i=0 ; i<100; i+=2) { doubleVec.push_back(i+0.3); } res = BinarySearchTemplate(doubleVec, 29.3); cout << "search result for [29]: " <<res<<endl; res = BinarySearchTemplate(doubleVec, 16.3); cout << "search result for [16]: " <<res<<endl; ////需要重载运算符“<”,以用于string //vector<string> strVec; //strVec.push_back("world"); //strVec.push_back("hello"); //strVec.push_back("b"); //strVec.push_back("world2"); //strVec.push_back("hello2"); //strVec.push_back("b2"); //sort(strVec.begin(),strVec.end()); //res = BinarySearchTemplate<string>(strVec,"a"); //cout << "search result for [a]: "<< res<<endl; //res = BinarySearchTemplate<string>(strVec,"world"); //cout << "search result for [world]: "<< res<<endl; } void main() { BinarySearchTemplateTest(); }
时间: 2024-10-11 11:05:33