【发布时间】:2018-06-10 23:07:25
【问题描述】:
我正在学习 C++,作为程序的最低要求,我希望使用通用编程构建一些基本数据结构(数组、向量、列表、堆栈、队列、矩阵等)。现在,虽然 C++ STL 中已经定义了数据容器的类,但我想通过编写自己的简单容器来学习。
为此,我创建了QPArray 类。 QPArray 数据对象是固定大小的数组。 QPStack 应该接受任何数据容器,这将是堆栈的主页。就像在 STL 中一样。
我已经测试了QPArray 并且代码适用于整数。
1) 我在网上搜索看看,我如何列出初始化我自己的QPArray,如下所示。但是,我找不到任何参考资料。
QPArray<int,5> arr= {2,3,5,7,8};
任何提示或链接都会非常有帮助。
2) 我尝试创建std::string's 的QPArray。我尝试将其中一个元素打印到控制台,但找不到正确版本的 operator << ()。我假设
TestQPArray.cpp
QPArray<std::string, 7> arr1;
arr1[0] = "C++";
arr1[1] = "for";
arr1[2] = "quantitative";
arr1[3] = "finance";
arr1[4] = "is";
arr1[5] = "absolutely";
arr1[6] = "awesome";
std::cout << arr1.at(3) << std::endl;//Compile error
对于发布整个列表 QPArray.h 深表歉意,但需要完整性。
QPArray.h
#ifndef QPARRAY_H
#define QPARRAY_H
#include <cstring>
template <class T, std::size_t N>
class QPArray
{
private:
T* items;
int maxsize;
public:
/*Constructors and destructors*/
QPArray();
QPArray(const T value);
QPArray(const QPArray<T, N>& a);
virtual ~QPArray();
/* Overload = operator*/
QPArray<T, N>& operator =(const QPArray<T, N>& a);
/* Selectors - Element access*/
T& at(int index);
T& operator [](int index);
T& front();
T& back();
/* Capacity*/
bool empty();
virtual int size();
virtual int max_size();
/*Operations*/
QPArray<T, N>& fill(T value);
};
template <class T,std::size_t N>
QPArray<T, N>::QPArray()
{
if (N > 0)
{
items = new T[N];
}
maxsize = N;
}
template <class T, std::size_t N>
QPArray<T, N>::QPArray(T value)
{
maxsize = N;
if (N > 0)
{
items = new T[N];
for (int i = 0; i < maxsize; i++)
{
items[i] = value;
}
}
}
template <class T, std::size_t N>
QPArray<T,N>::QPArray(const QPArray<T, N>& a)
{
maxsize = a.maxsize;
items = new T[maxsize];
for (int i = 0; i < maxsize; i++)
items[i] = a.items[i];
}
template<class T, std::size_t N>
QPArray<T, N>::~QPArray()
{
if(N > 0)
delete[] items;
}
template<class T, std::size_t N>
QPArray<T, N>& QPArray<T, N>::operator =(const QPArray<T, N>& a)
{
if (this == &a)
return *this;
if (maxsize != a.maxsize)
throw std::runtime_error(std::string("Src and target array bounds do not match"));
for (int i = 0; i < maxsize; i++)
{
items[i] = a.items[i];
}
return *this;
}
template <class T, std::size_t N>
T& QPArray<T, N>::at(int i)
{
return items[i];
}
template <class T, std::size_t N>
T& QPArray<T, N>::operator [](int index)
{
return items[index];
}
//Access the first element of the array
template <class T, size_t N>
T& QPArray<T, N>::front() {
return items[0];
}
//Access the last element of the array
template <class T, std::size_t N>
T& QPArray<T, N>::back() {
return items[maxsize - 1];
}
template <class T, std::size_t N>
bool QPArray<T, N>::empty()
{
if (maxsize == 0)
return true;
else
return false;
}
template <class T, std::size_t N>
int QPArray<T,N>::size()
{
return maxsize;
}
template <class T, std::size_t N>
int QPArray<T, N>::max_size()
{
return maxsize;
}
template <class T, std::size_t N>
QPArray<T, N>& QPArray<T, N>::fill(T value)
{
for (int i = 0; i < maxsize; i++)
{
items[i] = value;
}
return *this;
}
#endif // !ARRAY_H
【问题讨论】:
-
假设您同时包含了
<iostream>和<string>,输出行应该可以编译。一个完全不同的问题是,您使用new分配了很多您从未使用delete的对象。引用通常指的是现有对象,而不是全新对象。 -
我包含了
而忘记包含 。这解决了 std:string 的编译错误。我看你的关于配置的点。如果客户端将自定义类数据对象存储在 QPArray 中,我应该只返回对原始对象的引用而不是副本吗? -
您能在问题中介绍构造函数的实现吗?
-
@artona,我已经添加了构造函数实现。
标签: c++