二次元配列を生ポインタを使わずに使用するには

[戻る]
ガイヤ 2012/09/16(日) 10:04:45
宜しくお願いします。
環境 VC10
この二次元配列を生ポインタを使わずに(boost::shared_ptr等)使うコードを教えてもら
えませんか。

#include <iostream>

using namespace std;

int main(void)
{
    float **warray;
    int i, j;
    const int row = 10;
    const int col = 10;

    // 配列を作成
    warray = new float *[row];
    for(i = 0; i < row; i++) {
        warray[i] = new float [col];
    }
      
    for(i = 0; i < row; i++) {
        for(j = 0; j < col; j++) {
            warray[i][j] = static_cast<float>(i * col + j);
        }
    }

    for(i = 0; i < row; i++) {
        for(j = 0; j < col; j++) {
            cout << "warray[" << i << "][" << j << "] = " << warray[i][j] << 
"\n";
        }
    }
   
    // 配列を廃棄    
    for(i = 0; i < row; i++) {
        delete[] warray[i];
    }
    delete[] warray;

    return 0;
}

επιστημη [E-Mail] [HomePage] 2012/09/16(日) 10:43:19
vectorの二段重ねでよくね?

#include <iostream>
#include <vector>

using namespace std;

int main(void) {
  const int row = 10;
  const int col = 10;

  vector<vector<float>> warray(row, vector<float>(col));

  for(int i = 0; i < row; i++) {
    for(int j = 0; j < col; j++) {
      warray[i][j] = static_cast<float>(i * col + j);
    }
  }

  for(int i = 0; i < row; i++) {
    for(int j = 0; j < col; j++) {
      cout << "warray[" << i << "][" << j << "] = " << warray[i][j] << "\n";
    }
  }

  return 0;
}

ガイヤ 2012/09/16(日) 11:01:32
επιστημηさんありがとうございます。
>>vectorの二段重ねでよくね?
はいその使い方は理解していますし、すっきりとしたコードで分かりやすいと思います。
ただ、Google で「shared_ptr 二次元配列」と検索しても、
参考になるようなサンプルを見つけることができませんでした。もしかして、
shared_ptr は二次元配列では使うことができないのではと疑問を持った次第です。
あまり一般的では無い使い方なのかもしれませんが勉強のため知りたいのでご存知でした
ら教えて頂けないでしょうか。

επιστημη [E-Mail] [HomePage] 2012/09/17(月) 21:59:51
row*col個のfloatを確保し、ぶつ切りにして使えばいぃんじゃないかと。

#include <iostream>
#include <vector>
#include <memory>

using namespace std;

int main(void) {
  const int row = 10;
  const int col = 10;

  shared_ptr<float> data(new float[row*col]);
  vector<float*> warray;
  float* p = data.get();
  for(int i = 0; i < row; i++) {
    warray.push_back(p);
    p += col;
  }

  for(int i = 0; i < row; i++) {
    for(int j = 0; j < col; j++) {
      warray[i][j] = static_cast<float>(i * col + j);
    }
  }

  for(int i = 0; i < row; i++) {
    for(int j = 0; j < col; j++) {
      cout << "warray[" << i << "][" << j << "] = " << warray[i][j] << "\n";
    }
  }

  return 0;
}

tetrapod 2012/09/18(火) 09:12:14
> shared_ptr<float> data(new float[row*col]);
は shared_array にしないとダメなのではないかと小一時間 ry)

ガイヤ 氏
スマートポインタは smart_ptr だけでなく scoped_ptr や intrusive_ptr もある。
スマートポインタを使う意味というのは
・擬似ガベージコレクションしたい (自分の手で delete を書かない) ため
・自分の持ち物を他人と共用させる・させないため
だったりするので、そういう事前の意図が無いのにスマートポインタは使わない。
(使う必要が無い)

単に二次元配列を使うためだけにスマートポインタを使う必然は無いと思われる。
今までの文書だけからだと、スマートポインタに何を期待しているのかよくわからない
ので、どう解説してよいやらわからない。自分で案件整理できているかい?
その辺,もう少し解説してくれると何かサンプル出せるかもしれない。

閑話休題。
一般的に「配列」を扱うには smart_array, scoped_array を使う必要がある。
smart_ptr で配列、ってのはダメ例なので、探しても見つからないのかも・・・
こういう使い方( { } で閉じたスコープ内にて寿命が管理されるだけ)なら、
俺は vector が一番「スマート」だと思うのだが。

tetrapod 2012/09/18(火) 09:48:23
あう shared_ptr を smart_ptr と書いてる(恥)
読み替えておくんなまし。

ガイヤ 2012/09/23(日) 01:08:22
[[解決]]
επιστημη さん
tetrapod さん
ありがとうございました。

古いスレッドには追加発言できません。