Разреженные массивы и матрицы - PullRequest
0 голосов
/ 26 февраля 2012

Мне нужна помощь с программой, которая предоставляет пользователю произвольный доступ для чтения к любой записи массива.Если пользователь пытается прочитать за пределами полезной области, ваша структура данных должна возвращать 0. Кроме того, он предоставляет пользователю произвольный доступ на запись только в полезную область.Если пользователь пытается что-то записать в часть массива, которая должна быть 0, выведите сообщение об ошибке.Кроме того, программа должна иметь конструктор, который принимает параметры массива только для ввода и инициализирует весь массив до 0. Второй конструктор должен дополнительно принимать в качестве входных данных массив целых чисел, копирующих его значения в полезную часть создаваемого вами массива.

Это форма массива

[ 0 0 0 0 ... 0 0 1 2 3 4 5 0 0 .... 0 0 ] 

Я не уверен, как создать Sparse Array, также я не хочу использовать существующие библиотеки.

IЯ пытался создать динамический массив, который использует оператор Overload, но моя проблема в том, что я даже не знаю, что такое Sparse Array и как его создать.

#include <iostream>

using namespace std;

class MyArray
{
    friend ostream& operator<< (ostream &os, MyArray &array);

    public:
        MyArray (int size);
        MyArray (const MyArray &rhs);
        ~MyArray ();

        MyArray& operator= (const MyArray& rhs);
        int& operator[] (int index);
        int read_element (int index);
        void write_element (int index, int value);

    private:
        int *storage;
        int size;
};

#include "sparse_array_1d.h"

MyArray::MyArray (int size)
{
    storage = new int[size];
    this->size = size;
}

MyArray::MyArray (const MyArray &rhs)
{
    size = rhs.size;
    storage = new int[size];
    (*this) = rhs;
}

MyArray::~MyArray ()
{
    delete [] storage;
}

int MyArray::read_element (int index)
{
    return storage[index]; 
}

void MyArray::write_element (int index, int value)
{
    storage[index] = value;
}

MyArray& MyArray::operator= (const MyArray &rhs)
{
    int i,min_size;

    if (size < rhs.size)
        min_size = size;
    else
        min_size = rhs.size;

    for (i=0; i<min_size; i++)
        storage[i] = rhs.storage[i];

    return (*this);
}

int& MyArray::operator[] (int index)
{
    if (index < size && index >=0)
        return storage[index];

    return storage[0]; 
}

ostream& operator<< (ostream &os, MyArray &array)
{
    int i;

    os << "[ ";

    for (i=0; i<array.size; i++)
        os << array[i] << " ";

    os << "]" << endl;
    return os;
}

#include <iostream>
#include "sparse_array_1d.h"

using namespace std;

int main()
{
    int i,size;

    cout << "What array sizes would you like?" << endl;
    cin >> size;

    MyArray p1 (size);

    //int q=1;
    for (i=0; i<size; i++)
    {
        p1[i] = 0;
        //q++;
    }

    cout << "p1: " << endl;
    cout << p1;

    int x;

    cout << endl;
    cout << "enter numbers : " << endl;

    for (i=0 ; i<size; i++)
    {   
        cin >> p1[i];
    }

    cout << "This is the array" << endl;
    cout << p1;
    cout << endl;

    return 0;
}

Ответы [ 2 ]

0 голосов
/ 02 марта 2012

Как ни странно, я считаю, что мы в одном классе.Но послушайте, вы, вероятно, уже создали разреженный массив, когда вы динамически инициализировали массив до некоторого выбранного пользователем размера (int N;) и всех нулей.

Поскольку вы сразу заполнили все N элементов как ноль, вы начали свой разреженныймассив.После того, как первое сделано вашим конструктором, ваш деструктор автоматически (хорошо, если вы его построили) очищает всю память из массива.Итак, у вас есть массив из N слотов для элементов, готовых для приема N элементов.Тем не менее, до тех пор все N слотов для элементов в основном не заполнены и поэтому не используют память.Но массив все еще существует, следовательно, ваш разреженный массив.

0 голосов
/ 26 февраля 2012

Я думаю, что векторный класс плюс некоторые if должны делать все, что вы хотите, нет необходимости создавать его зановоВы можете использовать два вектора, один для хранения элементов и один для сохранения их положения.

vector<int> values,positions;
int c,success;

cout<<"Insert element"<<endl;
cin>>c;
positions.push_back(c);
cout<<"Insert value"<<endl;
cin>>c;
values.push_back(c);

cout<<"Which element you want to read?"<<endl;
cin>>c;
success=0;
for(int i=0;i<values.size();;i++){
if(positions[i]==c){
cout<<values[i]<<endl;
success=1;
}
if(success==0)
cout<<"Out of bounds: 0"<<endl;
...