2017-08-12 10 views
1

私は最近宣言のこの種は、私のC++コンパイラ配列のサイズを読み込んだ後、その配列を宣言する必要がありますか?

int h, w; 
cin>>h>>w; 

int a[h + 1][w + 1], f[h + 1][w + 1]; 

で動作します、私は実際、要求されたサイズを取得する前に、配列を宣言するのではなく、宇宙の複雑さを軽減するために、宣言のこのタイプを使用する必要があることを発見しましたか?

答えて

6

これらは、一部のコンパイラでサポートされている非標準の拡張です。それを信じてはいけません。 std::vectorを使用する方が良いでしょう。

int h, w; 
cin >> h >> w; 

std::vector<std::vector<int>> a{h + 1, std::vector<int>{w + 1}}; 
std::vector<std::vector<int>> f{h + 1, std::vector<int>{w + 1}}; 
5

Variable-length automatic arraysではなくで許可されています。拡張としてGCCはそれらを受け入れていますが、-std=c++14-pedanticで、次の例をビルドする場合は、警告取得します:

void foo(int n) { 
    int bar[n]; 
} 

警告:ISO C++が

[-Wvla]可変長配列「バー」を禁じているが

には、std::vectorという独自のダイナミックアレイタイプがあります。使用することはお勧めしません。

answer建設の良い例intw + 1default-insertedインスタンスと他のstd::vectorstd::vector<int>(w + 1)持つ要素のstd::vectorh + 1とコピーを示します。

0

現代のC++では、実行時に配列のサイズを決定することはできません。他の回答が指定されているので、c99はそれを許可します。最良のアプローチはベクトルを使用することです。

たとえば、このコードをMicrosoft Visual Studioでコンパイルし、何が起こるかを確認します。

#include <iostream> 
using namespace std; 

int main() 
{ 
    int size; 
    cin >> size; 
    int arr[size]; // 8th line 
} 

エラー(秒):あなたが使用する必要がありますどのような

source_file.cpp(8): error C2131: expression did not evaluate to a constant 
source_file.cpp(8): note: failure was caused by non-constant arguments or reference to a non-constant symbol 
source_file.cpp(8): note: see usage of 'num' 
Microsoft (R) C/C++ Optimizing Compiler Version 19.00.23506 for x64 

は、ベクトルです。ベクトルとは、実行時のサイズを決定します。あなたはもっと多くの要素を内部に置くことができ、サイズは大きくなります。あなたは外出先でより多くの要素を削除することができますし、それが小さくなるサイズ。

ただし、容量とサイズを混在させないように注意してください。容量の仕組みを見せるためのコードの例を次に示します。

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

int main() 
{ 
    vector<int> v; 
    cout << "Adding elements!" << endl; 
    for(int i = 0; i < 10; i++) 
    { 
     v.push_back(6); 
     cout << "Capacity: " << v.capacity() << endl; 
    } 

    cout << "Removing elements!" << endl; 
    for(int i = 0; i < 10; i++) 
    { 
     v.pop_back(); 
     cout << "Capacity: " << v.capacity() << endl; 
    } 
} 

のLinux x64の出力:

Adding elements! 
Capacity: 1 
Capacity: 2 
Capacity: 4 
Capacity: 4 
Capacity: 8 
Capacity: 8 
Capacity: 8 
Capacity: 8 
Capacity: 16 
Capacity: 16 
Removing elements! 
Capacity: 16 
Capacity: 16 
Capacity: 16 
Capacity: 16 
Capacity: 16 
Capacity: 16 
Capacity: 16 
Capacity: 16 
Capacity: 16 
Capacity: 16 

私は後で要素を削除しても、容量はその最後の値のままになります。

容量は、現在ベクトルに割り当てられている記憶領域のサイズを要素数で返します。

サイズは、ベクトルの要素数を返します。

楽しみ、幸運を祈る!

:容量もOSによって異なります。

マイクロソフトのx64出力:

Adding elements! 
Capacity: 1 
Capacity: 2 
Capacity: 3 
Capacity: 4 
Capacity: 6 
Capacity: 6 
Capacity: 9 
Capacity: 9 
Capacity: 9 
Capacity: 13 
Removing elements! 
Capacity: 13 
Capacity: 13 
Capacity: 13 
Capacity: 13 
Capacity: 13 
Capacity: 13 
Capacity: 13 
Capacity: 13 
Capacity: 13 
Capacity: 13 
関連する問題