二次元配列を生ポインタを使わずに使用するには – プログラミング – Home

二次元配列を生ポインタを使わずに使用す...
 
通知
すべてクリア

[解決済] 二次元配列を生ポインタを使わずに使用するには


ガイヤ
 ガイヤ
(@ガイヤ)
ゲスト
結合: 12年前
投稿: 3
Topic starter  

宜しくお願いします。
環境 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;
}


引用未解決
トピックタグ
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 15年前
投稿: 64
 

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;
}


返信引用
ガイヤ
 ガイヤ
(@ガイヤ)
ゲスト
結合: 12年前
投稿: 3
Topic starter  

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


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 15年前
投稿: 64
 

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
 tetrapod
(@tetrapod)
ゲスト
結合: 21年前
投稿: 830
 

> 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
 tetrapod
(@tetrapod)
ゲスト
結合: 21年前
投稿: 830
 

あう shared_ptr を smart_ptr と書いてる(恥)
読み替えておくんなまし。


返信引用
ガイヤ
 ガイヤ
(@ガイヤ)
ゲスト
結合: 12年前
投稿: 3
Topic starter  

επιστημη さん
tetrapod さん
ありがとうございました。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました