2

次のことを達成するにはどうすればよいですか。

std::vector<int> vec = { 1, 2, 3 };
const int N = vec.size();
// Now create NxN 2D array.

まず、できることはわかっていnewますが、後で削除することを忘れないでください。可能であれば、メモリの割り当て解除を処理する必要はありません。

第 2 に、スタック上で 2D 配列を宣言できません。これは、N が定数式ではない (この場合はできない) ためです。(いずれにせよ、私は VS2013 を使用しており、サポートしていませんconstexpr。)

std::array第三に、明らかに「ローカル変数は非型引数として使用できない」ため、使用できません(または使用方法がわからない可能性があります)。(VS2013 コンパイル ダイアログからこれをコピーして貼り付けましたが、この点についてはほとんど理解していません)。

第四に、私は を使用することを考えてunique_ptrいます。unique_ptr問題は、のような 1D 配列の使用方法は知ってstd::unique_ptr<int> arr{ new int[N] }いますが、2D 配列の使用方法がわかりません。

最後に、常にヒープ上に作成される C スタイルの配列の周りに独自のシン ラッパーを記述したり、独自の 2D 配列クラスを記述したりできることを知っています。しかし、C++ (C++11) でこれを行うネイティブまたは標準ライブラリの方法はありますか?

4

4 に答える 4

2

std::experimental::array_viewパックされたバッファの動的サイズ境界を持つ n 次元配列へのビューです。

したがって、1 つのアプローチは、連続したバッファーを作成することです (たとえば、 a std::vector<T>、または aを作成しstd::unique_ptr<T[]>、それを anで囲みarray_view<T,2>ます。

ビューオブジェクトを介してアクセスすると、配列から期待される操作が行われます。収納は、収納の見方とは別に管理されています。

これを 1 次元と 2 次元の場合に簡略化して書くのarray_viewは難しいことではありません。しかし、その結果、コードは高性能になり、使用時に非常に明確になります。グルー コード ( のarray_view) は少しトリッキーかもしれませんが、一度テストすればしっかりしているはずです。また、同様の構造が に追加される可能性が高いということは、stdそれが長くあいまいなままではないことを意味します。

私の経験では、ソリッド型を取得したら、それを、過去にデータのバンドルを渡すためarray_viewに (非効率的に) 使用していた場所のドロップイン代替として使用します。std::vector

独自に記述したい場合は、境界とインデックスに関するビットをスキップして、スライスを実装するだけです[].2番目の次元では1番目の次元がarray_view返され、1番目の次元array_viewでは.[]array_viewT&

于 2015-04-06T19:21:49.697 に答える
1

I suggest you write a class for it.

Example below: set() resizes it before setting values. The operator [] returns the column vector for that row, so when you apply the operator [] it returns the desired value. Let me know if you find any issue ;).

class 2DVector {
 std::vector<std::vector<int>> m_items;

 void set(int value, size_t row, size_t column) {
   for (int i=m_items.size(); i<=row; i++) {
      m_items.push_back(std::vector<int>());
   }
   for (int i=0; i<m_items.size(); i++) {
      for (int j=m_items[i].size(); j<=column; j++) {
      m_items[i].push_back(0);
   }
   m_items[row][column] = value;
 }

 std::vector<int> &operator [](size_t index) {
   return m_items[index];
 }
}

Usage:

2DVector v;
v.set(200, 0, 0);
v.set(201, 1, 0);
std::cout << v[0][0]; //prints 200
std::cout << v[1][0]; //prints 201
于 2015-04-06T15:11:31.963 に答える
-1

1D配列で2D配列を模倣するのはどうですか?openCV2で行われた方法のように

疑似コード

class 2DVector {         
 void set(int value, size_t row, size_t column) {
   m_items[row * column_size + column];
 }

 int &operator [](size_t row, size_t column) {
   return m_items[row * column_size + column];
 }

 private:
   std::vector<int> m_items;
}

または、boost::multi_array を使用するだけです (パフォーマンスが十分かどうかはわかりません)。

于 2015-04-07T06:23:47.133 に答える