2011-08-03 17 views
5

私は現在

std::vector<std::vector<std::string> > MyStringArray

を使用しかし、私は効率の敷地内にネストされたベクターの使用を思いとどまらSOにここにいくつかのコメントを読んだことがあります。
私はまだこのような状況のために入れ子にされたベクトルの代替の例を見ていません。メモリ内のstd :: stringsの2Dダイナミック配列を操作する最も効率的な方法は何ですか?

+1

なぜ、std :: stringsの2Dダイナミック配列を作成していますか?あなたのデータの性質についてもっと教えてください。この構造はある用途では効率的であるが、他の用途では効率が低い。 – bdonlan

+2

動的で正確には何ですか?作成したアレイの寸法は変わるのですか?それとも変わらないのですか? – LaC

+0

「操作する」とはどういう意味ですか?どのくらいの頻度でデータを変更しますか?どのくらいの頻度でそれを読むのですか? –

答えて

1

指定された設計目標を考慮すると、私にとっては合理的な設計に見えます。外側ベクトルのサイズを変更する操作は避けるべきです。これらは、全体の構造内のすべてのデータの完全なコピーをもたらす可能性があります(これは、C++ 0x STL実装でやや緩和される可能性があります)。

class TwoDArray 
{ 
    size_t NCols; 
    std::vector<std::string> data; 

public: 
    explicit TwoDArray(size_t n) : NCols(n) { } 

    std::string & operator()(size_t i, size_t j) { return data[i * NCols + j]; } 
    const std::string & operator()(size_t i, size_t j) const { return data[i * NCols + j]; } 

    void set_number_of_rows(size_t r) { data.resize(NCols * r); } 

    void add_row(const std::vector<std::string> & row) 
    { 
    assert(row.size() == NCols); 
    data.insert(data.end(), row.begin(), row.end()); 
    } 
}; 

使用:

+1

これはスワップ可能なタイプベクトルのコピーはコピーするのではなくスワップすることができます。基本的には、移動の建設が存在する前に移動を行います。 VC++ 2008のSTL実装はこのトリックを使用しました。 –

3

ここランタイム構成可能列番号を持つ単純な動的な2次元配列の

TwoDArray arr(5); // five columns per row 
arr.set_number_of_rows(20); 
arr(0, 3) = "hello"; 
arr(17,2) = "world"; 

これは単に完全に任意であり、ランダム例です。あなたの本当のクラスは、あなたがやっていることに適したインターフェースメソッドを含んでいなければなりません。ラッピングクラスをまったく持たず、ネイキッドベクトルを直接扱うこともできます。

重要な機能は、ネストされたベクトル '[i][j]を置き換える(i,j)によって2次元アクセサ演算子です。

+0

これは有望そうです。私はいくつかのテストをさせてください。私はNColdがタイプミスだったと思う、あなたはNicolsを意味した。また、add_row関数は行の代わりにvを参照していますか? – user754425

+0

うん、タイプミス...修正! –

0

最もefficent方法は、文字列がメモリ(ヌルターミネータで区切られた)に連続して有することが考えられ、それぞれの配列に各文字列への参照の連続アレイ、および参考文献の他連続アレイを有します。

これはローカリティを維持してキャッシュを効果的に使用するのに役立ちますが、最終的にどのようにデータにアクセスするかによって異なります。

関連する問題