私は現在
std::vector<std::vector<std::string> > MyStringArray
を使用しかし、私は効率の敷地内にネストされたベクターの使用を思いとどまらSOにここにいくつかのコメントを読んだことがあります。
私はまだこのような状況のために入れ子にされたベクトルの代替の例を見ていません。メモリ内のstd :: stringsの2Dダイナミック配列を操作する最も効率的な方法は何ですか?
答えて
指定された設計目標を考慮すると、私にとっては合理的な設計に見えます。外側ベクトルのサイズを変更する操作は避けるべきです。これらは、全体の構造内のすべてのデータの完全なコピーをもたらす可能性があります(これは、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());
}
};
使用:
これはスワップ可能なタイプベクトルのコピーはコピーするのではなくスワップすることができます。基本的には、移動の建設が存在する前に移動を行います。 VC++ 2008のSTL実装はこのトリックを使用しました。 –
ここランタイム構成可能列番号を持つ単純な動的な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次元アクセサ演算子です。
これは有望そうです。私はいくつかのテストをさせてください。私はNColdがタイプミスだったと思う、あなたはNicolsを意味した。また、add_row関数は行の代わりにvを参照していますか? – user754425
うん、タイプミス...修正! –
最もefficent方法は、文字列がメモリ(ヌルターミネータで区切られた)に連続して有することが考えられ、それぞれの配列に各文字列への参照の連続アレイ、および参考文献の他連続アレイを有します。
これはローカリティを維持してキャッシュを効果的に使用するのに役立ちますが、最終的にどのようにデータにアクセスするかによって異なります。
- 1. 2D std :: vectorで行/列を移動する最も効率的な方法
- 2. C#配列の重複した操作を避ける最も効率的な方法は何ですか?
- 3. Pythonの2D配列よりスライディングウィンドウでモードを計算する最も効率的な方法は何ですか?
- 4. 2D配列を分割する最も効率的な方法は?
- 5. リストビューを作成する最も効率的な方法は何ですか?
- 6. 目的Cのintの配列をコピーする最も効率的な方法は何ですか?
- 7. MySQLでフィールドを操作する最も効率的な方法は何ですか?
- 8. 2つの配列のアイテムを比較/ソートする最も効率的な方法は何ですか?
- 9. ブール値の2つの配列を比較する最も効率的な方法は何ですか?
- 10. マージ操作中にテーブルを更新する最も効率的な方法は何ですか?
- 11. 配列から項目を削除する最も効率的な方法は?
- 12. 最も効率的な方法のハンドラ
- 13. ウェブページのアニメーションヘッダをコーディングする最も効率的な方法は何ですか?
- 14. ユーザーのDirectoryEntryをロードする最も効率的な方法は何ですか?
- 15. 文字列内のマークアップをトレースする最も効率的な方法は何ですか?
- 16. Cでバイト配列をマージする最も効率的な方法は何ですか?
- 17. Eigen行列をループする最も効率的な方法
- 18. c - char *配列をint型とfloat型に変換する最も効率的な方法は何ですか?
- 19. MySQLの文で最も効率的な配列の使用方法は?
- 20. アナリティクスビーコンを保存する最も効率的な方法は何ですか?
- 21. UIImageViewを移動する最も効率的な方法は何ですか?
- 22. アクティビティログを作成する最も効率的な方法
- 23. Pythonで最も効率的なグラフデータ構造は何ですか?
- 24. LIMITの最も効率的な方法はJOINですか?
- 25. メイとオッズのシステムの最も効率的な方法は何ですか?
- 26. ページにAPIを含める最も効率的な方法は何ですか?
- 27. シングルトンと対話する最も効率的な方法は何ですか?
- 28. リスト内で最も長い文字列を選択するPythonの最も効率的な方法は?
- 29. jQueryリンクを作る最も効率的な方法は?
- 30. リスト操作が最も効率的です。
なぜ、std :: stringsの2Dダイナミック配列を作成していますか?あなたのデータの性質についてもっと教えてください。この構造はある用途では効率的であるが、他の用途では効率が低い。 – bdonlan
動的で正確には何ですか?作成したアレイの寸法は変わるのですか?それとも変わらないのですか? – LaC
「操作する」とはどういう意味ですか?どのくらいの頻度でデータを変更しますか?どのくらいの頻度でそれを読むのですか? –