2011-10-12 73 views
0

我有一個二維的字符串表(使用STL向量),並試圖修改,以便該表是向量的字符串向量的指針向量。我知道這將需要更改構造函數,以便動態創建行,並將指向行的指針插入到表中,但我不確定如何首先創建此表。聲明向量的指針向量的字符串

在我的.h文件:

class StringTable 
{ 
public: 

    StringTable(ifstream & infile); 

    // 'rows' returns the number of rows 
    int rows() const; 

    // operator [] returns row at index 'i'; 
    const vector<string> & operator[](int i) const; 

private: 
    vector<vector<string> > table; 

}; 

在我的.cpp文件:

StringTable::StringTable(ifstream & infile) 
{ 
    string   s; 
    vector<string> row; 

    while (readMultiWord(s, infile)) // not end of file 
    { 
     row.clear(); 
     do 
     { 
      row.push_back(s); 
     } 
     while (readMultiWord(s, infile)); 
     table.push_back(row); 
    } 
} 

int StringTable::rows() const 
{ 
    return table.size(); 
} 

const vector<string> & StringTable::operator[](int i) const 
{ 
    return table[i]; 
} 

我覺得這可能是一個非常簡單的開關,但我沒有很多的使用矢量的經驗,我不知道從哪裏開始。任何指導,非常感謝!

+5

你爲什麼要指針的載體?這聽起來像一個可怕的想法。 –

+1

@BrendanLong它是C/C++! –

+0

爲什麼你在'while(readMultiWord(s,infile))'裏面有'while(readMultiWord(s,infile))'?它是否會在行尾返回「false」? –

回答

1

它看起來像你試圖創建某種形式的多維向量。你有沒有考慮過使用boost? http://www.boost.org/doc/libs/1_47_0/libs/multi_array/doc/user.html

+0

如果你真的想推出你自己的,Meyers的Effective C++涵蓋了這個確切的場景。 TLDR:而不是用operator []篡改事物,只需創建一個函數「string getElement(int row,int col)」和「setElement(int row,int col,const string&value);」 – teambob

-1

確定最簡單的方法是使用typedef。另外,你似乎在你的頭文件中使用'using'子句 - 你永遠不應該這樣做。

class StringTable 
{ 
    public: 
     typedef std::vector<std::string> Strings_t; 
     std::vector<Strings_t *> table; 
}; 

不要加入時,現在你將需要分配內存,即忘記:

StringTable tbl; 
StringTable::Strings_t *data_ptr=new StringTable::Strings_t; 

data_ptr->push_back("foo"); 
data_ptr->push_back("bar"); 

tbl.table.push_back(data_ptr); 

[更正]

+1

'typedef'如何讓這個更清晰?即使在你微不足道的例子中,它也會導致問題(「Strings_t」vs「String_t」)。 –

+1

是的,@Paul,不要在頭文件中使用'namespace std;'......其實,我不會在任何地方使用它*。 –

+0

@Brendan - a)我應該編譯(String_t vs Strings_t)是一個錯字,並且我忘記了類命名空間 –