我正在学习lippman的Essential C ++。这是我感到困惑的源代码。
#include "stdafx.h"
#include <iostream>
using namespace std;
#include <vector>
#include <list>
template <const typename elemtype>
inline elemtype* begin(const vector<elemtype> &vec) {
return vec.empty() ? 0 : &vec[0];
}
template <const typename elemtype>
inline elemtype* end(const vector<elemtype> &vec) {
return vec.empty() ? 0 : &vec[vec.size()];
}
template < typename elemtype>
int* find(const elemtype *first, const elemtype *last, elemtype value) {
if (!first || !last) {
return 0;
}
for (; first != last; ++first) {
if (*first == value)
return first;
}
return 0;
}
int main()
{
int a[] = { 1,1,2,3,5,8,13,21,34 };
int search_value = 5;
int *pi = find(a, a + 9, search_value);
vector<int> svec(a, a + 9);
int *srch_add;
srch_add = find(begin(svec), end(svec), search_value);
cout << *srch_add;
getchar();
return 0;
}
这个来自基本c ++的例子实际上在main中调用第二个find函数时出错了。在仔细检查错误可能来自的所有可能方式后,我终于发现错误在于内联函数的const参数 - 开始和结束。它们应该像这样修改:
template <typename elemtype>
inline elemtype* begin(vector<elemtype> &vec) {
return vec.empty() ? 0 : &vec[0];
}
template <typename elemtype>
inline elemtype* end(vector<elemtype> &vec) {
return vec.empty() ? 0 : &vec[vec.size()];
}
我解决了这个问题而不理解我为什么要这样做。内联函数返回第一个整数的地址和向量之后的下一个整数。执行内联函数后,&amp; vec已经消失,find函数中的指针应该能够改变指向的地址。为什么这里存在不连续性?