实现Array
int main()
{
int size = 5;
int array[size];//这样是错误的
int* arr = new int[size]; //堆分配可以
}
C++提供的标准库
#include<array>
int main()
{
std::array<int, 10> collection;//使用模板构建的
collection.size();//得到大小
for (int i : collection) //迭代器
{
}
}
现在要去做一个类似的
class Array
{
public:
Array(int size)
{
m_Data = (int*)alloca(size)
}
private:
int* m_Data;
};
int main()
{
int size = 5;
Array data(size);
}
使用模板在栈上
template<size_t S>
class Array
{
public:
private:
int m_Data[S];
};
int main()
{
int size = 5;
Array<5> data;
}
如何时它是其他类型的数组
template<typename T,size_t S>
class Array
{
public:
private:
T m_Data[S];
};
int main()
{
int size = 5;
Array<int ,5> data;
}
加入Size
static_assert 可以中断程序
template<typename T,size_t S>
class Array
{
public:
constexpr int Size() const // constexpr将运算尽量放在编译阶段,而不是运行阶段
{
return S;
}
private:
T m_Data[S];
};
int main()
{
int size = 5;
Array<int ,5> data;
static_assert(data.Size() < 10, "size too large"); // 加入constexpr才能比较
for (int i = 0; i < data.Size(); i++)
{
}
}
加入[]来读取值
T& operator[](int index)
{
return m_Data[index];
}
//这样就能使用了
for (int i = 0; i < data.Size(); i++)
{
data[i];
}
const T& operator[](int index) const { return m_Data[index]; }
使用size_t来表达大小和索引
template<typename T,size_t S>
class Array
{
public:
constexpr int Size() const // constexpr将运算尽量放在编译阶段,而不是运行阶段
{
return S;
}
T& operator[](size_t index)
{
return m_Data[index];
}
const T& operator[](size_t index) const { return m_Data[index]; }
private:
T m_Data[S];
};
const auto& ptr = data;
for (int i = 0; i < data.Size(); i++)
{
ptr[i] = 2; //这里会报错
data[i] = 2; //只能这样
std::cout << ptr[i] << std::endl;
}
添加越界保护
T& operator[](size_t index)
{
//增加一些保护
if (!(index < S))
{
__debugbreak();
}
return m_Data[index];
}