2012-02-25 352 views
0

我需要一個程序,它允許陣列中的任何條目中的用戶隨機讀取訪問幫助。如果用戶試圖在有用區域之外讀取,則數據結構應該返回0.另外,它允許用戶只對有用區域進行隨機寫入訪問。如果用戶嘗試在應該爲0的數組部分寫入內容,請輸出錯誤消息。 除了程序應該具有的構造函數,取陣列參數作爲唯一的輸入並初始化所有的陣列的爲0。第二個構造應另外作爲輸入整數數組其值複製到正在製作的陣列的有用部分。稀疏矩陣和矩陣

這是數組

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

的我不知道如何創建稀疏陣,也是我不希望使用現有的庫形式。

我試圖創建一個動態數組,它採用超載運營商,但我的問題是,我甚至不知道什麼是稀疏陣以及如何創建它。

#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; 
} 
+1

您的具體問題是什麼? – 2012-02-25 21:33:52

+0

似乎你想要一個散列集。 – 2012-02-25 21:35:29

+0

我只是不知道如何初始化所有的數組爲0。此外,我真的不明白稀疏數組是如何工作的 – toky 2012-02-25 21:37:16

回答

-2

我認爲Vector類加上一些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; 
0

有趣的是,我相信我們是在同一班。但是聽着,當您將數組動態初始化爲某個用戶選擇的大小(int N;)和全零時,您可能已經創建了稀疏數組。

既然你立刻充滿所有的N個元素是零,你開始你的稀疏陣列。在第一次完成你的構造函數後,你的析構函數會自動(如果你創建了一個)清除數組中的所有內存。所以你有一個N個元素的插槽可以接收N個元素。但是,在此之前,所有N個元素插槽區域基本上都是空的,因此不使用內存。但數組仍然存在,因此您的稀疏數組。

+0

設置爲零的條目仍佔用內存。數組所使用的內存由您在'new'語句中分配了多少內存來定義。適當的稀疏數組實現背後的關鍵思想是僅爲非零元素分配內存。 – jogojapan 2012-03-02 04:17:19