常量 T * 搜索 ( 常量 T &) 返回不起作用
const T * search ( const T &) return not working
我有这个问题,我的程序在开始使用这个函数后崩溃。我不知道如何正确地返回所需的类型。它是在模板中进行二进制搜索。我尝试将其更改为T*search,将array[middle]
强制转换为const,并执行类似const T * out = &array[middle];
的操作,但每当我添加&,它崩溃了。如果我把它拿走,只返回数组[中间],它会说:
cannot convert 'Fractions' to 'const Fractions*' in return
我应该如何正确返回?我有这样声明的数组,这个函数在同一个类中:它应该适用于任何类型,我们得到了类Fractions来测试它,所以它是Fractions类型的普通数组,没有什么奇怪的。
T * array;
和
const T *search(const T &inElement){
unsigned low = 0;
unsigned high = numberOfElements-1;
unsigned middle = 0;
while(low <= high){
middle = low + (high - low)/2;
if( inElement == array[middle]){
const T * out = &array[middle]; //problem here
return out;
}
else if(inElement < array[middle]){
high = middle -1;
}
else{
low = middle + 1;
}
}
return NULL;
}
指针和引用对我来说一直是个问题,我读过关于向量的类似主题,但仍然无法理解
我班的其他同学:
#include <iostream>
#include "Fractions.cpp"
using namespace std;
template<class T,unsigned n>
class SortedArray {
T * array;
unsigned length;
unsigned numberOfElements;
T element;
unsigned position;
public:
SortedArray() {
length = n;
array = new T[n];
numberOfElements = 0;
position = 0;
}
bool first(){
if(numberOfElements >= 1){
element = array[0];
position = 0;
return true;
}
return false;
}
bool next(){
if(position+1 < numberofElements){
position++;
element = array[position];
return true;
}
return false;
}
const T & aktual(){
return element;
}
SortedArray & operator << (const T &element){
if(numberOfElements == length || search(element) == NULL){return (*this);}
if(numberOfElements == length){return (*this);}
int i = numberOfElements;
for (; i > 0 && array[i-1] > element; i--)
{
array[i] = array[i-1];
}
array[i] = element;
numberOfElements++;
return (*this);
}
operator unsigned () const{
return numberOfElements;
}
const T *search(const T &inElement){
//this is the function causing problems
}
~SortedArray() {
delete [] array;
array = NULL;
}
};
int main()
{
SortedArray<Fractions,20> pz;
typedef Fractions Z;
pz << Z(1,3) << Z(3,5) << Z(7,4) << Z(3,4) << Z(2,3) << Z(7,2)
<< Z(5,4) << Z(1,4) << Z(6,7) << Z(4,3) << Z(2,3);
cout << "nNumber of elements : " << pz.operator unsigned() << endl;
return 0;
}
当numberOfElements
为0时,您的函数将失败。你有一条线:
unsigned high = numberOfElements-1;
当numberOfElements
为0时,high
将接收广播给unsigned int
的值-1
,这是一个非常大的数字。这将导致对数组的访问超出其末尾,这是未定义的行为,并且经常会崩溃。
关于你关于return
声明的问题,你现在所掌握的是正确的。
相关文章:
- 什么时候在C++中返回常量引用是个好主意
- 为什么我可以通过引用修改常量返回
- 返回常量对象引用 (getter) 和仅返回字符串有什么区别?
- 为什么 STL 容器适配器堆栈中的 top 返回常量引用?
- 如何返回向量的常量引用?
- C++ 获取函数在常量引用中按值返回的结果
- NVCC 错误:string_view.h:constexpr 函数返回是非常量
- 是否可以跨 dll 边界返回常量引用/指向 std::vectors?
- 为什么常量返回防止:(A1 = A2) = A3?
- 为什么我可以改变常量对象中的成员变量,这是返回常量对象函数的结果?
- PyBind11:返回对 std::vector of std::unique_ptr 的常量引用
- 如何为具有常量类型的函数正确转换来自 DLsym 的返回值?
- 返回对常量结构(指针类型)成员的引用:明显的左值到右值转换
- 如何在另一个成员函数中修改具有常量返回类型的成员函数的返回值
- 一种创建将字符串常量返回给枚举的类的廉价方法,反之亦然
- 重载运算符:常量与非常量返回类型:任何性能差异
- 常量 T * 搜索 ( 常量 T &) 返回不起作用
- 常量返回类型在 NRVO 案例中的相关性
- 函数常量返回类型:类型引用的初始化无效
- 后缀自增运算符的常量返回类型