题目
在这个问题中,您将练习c++类的基本用法。我们已经提供了Array类的定义,它封装了一个动态分配的数组。您的任务是实现所有提供的方法。Array类包含以下成员函数:
代码
// DO NOT MODIFY THE CODE BELOW
#include <cstddef>
#include <iostream>
class Array {
public:
Array();
explicit Array(std::size_t n);
explicit Array(int* begin, int* end);
Array(const Array& other);
Array& operator=(const Array& other);
~Array();
int& at(std::size_t n);
const int& at(std::size_t n) const;
std::size_t size() const;
bool empty() const;
void clear();
Array slice(std::size_t l, std::size_t r, std::size_t s = 1) const;
private:
std::size_t m_size;
int* m_data;
};
// YOUR CODE STARTS HERE
Array::Array()
{
m_data = nullptr;
m_size = 0;
}
Array::Array(std::size_t n)
{
m_size = n;
m_data = new int[m_size];
}
Array::Array(int* begin, int* end)
{
m_size = (end - begin);
m_data = new int[m_size];
for (int i = 0; i < m_size; i++) {
m_data[i] = begin[i];
}
}
Array::Array(const Array& other)
{
m_size = other.size();
m_data = new int[m_size];
for (int i = 0; i < m_size; i++) {
m_data[i] = other.m_data[i];
}
}
Array& Array::operator=(const Array& other)
{
m_size = other.size();
m_data = new int[m_size];
for (int i = 0; i < m_size; i++) {
m_data[i] = other.m_data[i];
}
return *this;
}
Array::~Array()
{
delete[] m_data;
}
int& Array::at(std::size_t n)
{
return m_data[n];
}
const int& Array::at(std::size_t n) const
{
return m_data[n];
}
std::size_t Array::size() const
{
return m_size;
}
bool Array::empty() const
{
if (m_size == 0)return true;
return false;
}
void Array::clear()
{
m_size = 0;
delete[] m_data;
}
Array Array::slice(std::size_t l, std::size_t r, std::size_t s) const
{
if (l > r)return Array();
std::size_t ret_size = (r - l + 1) / s;
Array ret(ret_size);
for (std::size_t i = 0; i < ret_size; i++) {
ret.m_data[i] = m_data[s * i];
}
return ret;
}
// YOUR CODE ENDS HERE
int main() {
// You can test your implementation here, but we will replace the main function on OJ.
Array a1;
std::cout << a1.size()<<std::endl;
Array a2(10);
std::cout << a2.size() << std::endl;
int a[10] = { 3, 1, 4, 1, 5, 9, 2, 6, 5, 3 };
Array a3(a, a + 10);
std::cout << a3.size()<<" " << a3.at(5)<<std::endl;
Array a4 = a3;
a4.slice(0, 9, 2);
for (int i = 0; i < 5; i++) {
std::cout << a4.at(i) << " ";
}
return 0;
}