2017-12-09 9 views
-3

明らかに私はこれを誤解していますが、ダイナミックメモリアレイに特定の数値を設定するだけです。ダイナミックアレイに特定の値を設定するにはどうすればよいですか?

#include <iostream> 
#include <cstdlib> 
using namespace std; 

int main() { 
    int *arr = new int [4][5] 
    {{3, 6, 9, 23, 16}, 
    {24, 12, 9, 13, 5}, 
    {37, 19, 43, 17, 11}, 
    {71, 32, 8, 4, 7}}; 

    cout<< arr [1][3]<< endl<< endl; 
    int *x = new int; 
    *x = arr [2][1]; 
    cout<< x<< endl; 
    cout<< *x<< endl << endl; 
    delete x; 
    *x = arr [0][3]; 
    cout<< x<< endl; 
    cout<< *x<< endl; 
    delete x; 
    delete [] arr; 
    return; 
} 
+0

私はコードを正しく、明らかに投稿する方法も知らないです。 – user9076567

+0

推奨読書:https://stackoverflow.com/questions/46991224/are-there-any-valid-use-cases-to-use-new-and-delete-raw-pointers-or-c-style-arr – user0042

+3

このコードで何をしたいですか?あなたはすべてを非常に複雑にする 'new'を使用しています。メモリを '削除 'してからアクセスし、再度' delete'します。非常に壊れました。そして、 'return'を書いたのは、' int'を '返す 'か、' return'を完全に残す必要があるので、コンパイルすべきではありません。 – nwp

答えて

1

多次元配列のC++サポートは、ライブラリ(ブーストなど)によって行われます。クラスがなければ、実際には1D配列しか理解できません。特にC/C++が実際には配列の最初の要素へのポインタとして見えるポインタを使用しているときはそうです。あなたの例がクラスなしで動作するようにするには、1つの行を保持する型を定義し、その型の配列を作成する必要があります。

#include <iostream> 
#include <cstdlib> 
using namespace std; 

int main() { 
    typedef int row_t[5]; 
    row_t *arr = new row_t[4] {{3, 6, 9, 23, 16}, 
    {24, 12, 9, 13, 5}, 
    {37, 19, 43, 17, 11}, 
    {71, 32, 8, 4, 7}}; 

    cout<< arr[1][3] << endl<< endl; 
    int *x = new int; 
    *x = arr [2][1]; 
    cout<< x<< endl; 
    cout<< *x<< endl << endl; 

    *x = arr [0][3]; 
    cout<< x<< endl; 
    cout<< *x<< endl; 
    delete x; 
    delete [] arr; 
    return 0; 
} 

また、あなたのように1次元アレイ上に2次元配列を投写することができますブーストのようなものを使用して動的データを2次元のインデックスを取得するには

#include <iostream> 
#include <cstdlib> 
using namespace std; 

int main() { 
    int *arr = new int[20] {3, 6, 9, 23, 16, 
    24, 12, 9, 13, 5, 
    37, 19, 43, 17, 11, 
    71, 32, 8, 4, 7}; 

    cout<< arr[5*1+3] << endl<< endl; 
    int *x = new int; 
    *x = arr [5*2+1]; 
    cout<< x<< endl; 
    cout<< *x<< endl << endl; 

    *x = arr [5*0+3]; 
    cout<< x<< endl; 
    cout<< *x<< endl; 
    delete x; 
    delete [] arr; 
    return 0; 
} 

:: multi_array

演算子を使用して
#include <iostream> 
#include <boost/multi_array.hpp> 
using namespace std; 

int main() { 
    boost::multi_array< int, 2 >arr(boost::extents[4][5]); 
    int tmp[] { 3, 6, 9, 23, 16, 
     24, 12, 9, 13, 5, 
     37, 19, 43, 17, 11, 
     71, 32, 8, 4, 7 }; 
    arr = boost::multi_array_ref< int, 2 >(&tmp[0], boost::extents[4][5]); 

    cout<< arr [1][3]<< endl << endl; 
    int *x = new int; 
    *x = arr [2][1]; 
    cout<< x<< endl; 
    cout<< *x<< endl << endl; 
    *x = arr [0][3]; 
    cout<< x<< endl; 
    cout<< *x<< endl; 
    delete x; 
    // delete [] arr; 
    return 0; 
} 
+0

PS: 'endl'は、ストリームの' flush'を挿入するので、コードが潜在的に非常に遅くなります。代わりに '\ n'を使用してください。 –

+0

よくできました。あなたはオペレーターnewを使用することに関する勧告を投げることができますか? –

+0

気にしないでください。私は自分のキーボードに問題を取り込んだ。 –

1

新しいことは難しいです。あなたのプログラムには、newとdeleteの使用に関する多くのエラーがあります。すべてのトリッキーを隠し、それ自身の後でクリーンアップする動的配列の標準実装、つまりstd :: vectorがあります。また、 "using namespace std;"の使用を避けてください。あなたはそのように名前の競合を困惑させることができます。

ワークス良い -

#include <iostream> 
#include <cstdlib> 
#include <vector> 

using std::cout; 
using std::endl; 
using std::vector; 

int main() { 
    vector<vector<int>> arr 
    { { 3, 6, 9, 23, 16 }, 
    { 24, 12, 9, 13, 5 }, 
    { 37, 19, 43, 17, 11 }, 
    { 71, 32, 8, 4, 7 } }; 

    cout<< arr[1][3]<< endl<< endl; 
    int x = arr[2][1]; 
    cout<< x<< endl; 
    cout<< x<< endl << endl; 
    x = arr[0][3]; 
    cout<< x<< endl; 
    return 0; 
} 

P.S. arrを使ったやり方については、何も動的ではありません。代わりにそれを宣言することができます:

int arr[4][5] 
{ { 3, 6, 9, 23, 16 }, 
{ 24, 12, 9, 13, 5 }, 
{ 37, 19, 43, 17, 11 }, 
{ 71, 32, 8, 4, 7 } }; 
+0

私は動的にメモリを正しく使用していないことを知っています。私は正直なところ、どんなベクトルがまだあるのかを知りませんでした。名前空間stdを使用すると何が問題になりますか? ? – user9076567

+0

@ user9076567 'using namespace std'では何が問題なのでしょうか?なぜ、C++に名前空間を導入したのでしょうか?あなたは、特にグローバルスコープで、名前空間を含むことをやめることを理解しています。@ジブ・ダドソンの個々の機能を「使う」という例ははるかに安全です。 'using'ステートメントを' main'関数に入れて、ステートメントのスコープをさらに減らす方が良いでしょう。 –

+0

ここで 'int arr [4] [5]'に与えた 'vector 'や 'typedef ... row_t'を使ったmulti_array、int []の例には大きな違いがあることに注意してください。それはメモリ内のデータのメモリレイアウトにあります。 multi_arry、int []とint [] []には、連続した1つのintブロックがあります。 'ベクトル>'は、各行が別々のメモリ位置にあります。 row_tの例では、row_tオブジェクトを連続してパッキングしたり、メモリアライメントのためにパディングしたりすることがあります(ここではそうではありませんが、文字の配列で発生する可能性があります)。 –

関連する問題