【问题标题】:Elementary data structures using generic programming使用泛型编程的基本数据结构
【发布时间】: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'sQPArray。我尝试将其中一个元素打印到控制台,但找不到正确版本的 operator &lt;&lt; ()。我假设

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

【问题讨论】:

  • 假设您同时包含了&lt;iostream&gt;&lt;string&gt;,输出行应该可以编译。一个完全不同的问题是,您使用new 分配了很多您从未使用delete 的对象。引用通常指的是现有对象,而不是全新对象。
  • 我包含了 而忘记包含 。这解决了 std:string 的编译错误。我看你的关于配置的点。如果客户端将自定义类数据对象存储在 QPArray 中,我应该只返回对原始对象的引用而不是副本吗?
  • 您能在问题中介绍构造函数的实现吗?
  • @artona,我已经添加了构造函数实现。

标签: c++


【解决方案1】:

广告 1 尝试使用 std::initializer_list。它使容器能够将 {a, b, c, d} 分配给构造的变量。

例如

template <class T, std::size_t N>
QPArray<T,N>::QPArray(std::initializer_list<T> v)
{
    maxsize = v.size();
    items = new T[maxsize];
    int i = 0;
    for (auto & elem: v) 
        items[i++] = elem;
}

Ad 2 正如@Bo Persson 指出的那样,您没有在文件中包含字符串库。

【讨论】:

  • 我删除了所有动态分配。从本质上讲,QPArray 将是一个固定大小的数组,因此使用 new 使其成为 C 和 C++ 代码的杂烩。我觉得那是糟糕的编程。
  • 如果是“糟糕”的编程 new 将不会包含在 C++ 中。语言不包含“不好”的特性(尽管理所当然,但有些比其他更好)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-16
  • 1970-01-01
  • 1970-01-01
  • 2019-10-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多