2009-04-16 51 views
44

配列にintを追加したいのですが、問題はインデックスが何であるか分かりません。C++配列に要素を追加する方法は?

コードは私がに割り当てていますどのような指標を知っているので動作しますが、私は、インデックスがわからない場合はどのような... PHPで

こと

int[] arr = new int[15]; 
arr[0] = 1; 
arr[1] = 2; 
arr[2] = 3; 
arr[3] = 4; 
arr[4] = 5; 

、私は自動的に追加されますarr[]=22;を行うことができます22を配列の次の空のインデックスに置き換えます。しかし、C + +で私はそれを行うことはできません、それは私にコンパイラのエラーを与える。あなたは何をお勧めしますか?

+11

実際には、「そのコード」はコンパイルされません。 "int [] arr"はC/C++で配列を宣言する方法ではありません - "int arr []"です。しかし、あなたのコードには深刻な問題があります。 –

答えて

36

プレーンな配列とC++にあなたが言うことを行うための方法はありません。そのためのC++ソリューションは、std::vectorを提供するSTLライブラリを使用することです。

あなたはこの方法でvectorを使用することができます。

std::vector<int> arr; 

arr.push_back(1); 
arr.push_back(2); 
arr.push_back(3); 
+1

"#"が必要です。 = D –

+0

注目すべきこと - 配列として渡す必要がある場合は、配列からベクトルを取得することができます。https://stackoverflow.com/a/2923290/802397 – netpoetica

58

C++の配列は実行時にサイズを変更できません。そのためには、代わりにvector<int>を使用してください。

vector<int> arr; 
arr.push_back(1); 
arr.push_back(2); 

// arr.size() will be the number of elements in the vector at the moment. 

コメント欄で述べたように、vectorvectorヘッダとstd名前空間で定義されています。また

#include <vector>

と、いずれかのコード内でstd::vectorを使用するか、

using std::vector; 

または

using namespace std; 

#include <vector>行の後に追加します。それを使用するには、必要があります。

+1

+1 - >私は同意するならば、ベクトルはこれを行うためのはるかに簡単な方法です。あなたが必要であることを忘れないでください: #include

+2

また、インスタンス化の前にstd :: vectorまたはstd :: vectorを使用して追加してください。 –

13

は、ベクターを使用してください:

#include <vector> 

void foo() { 
    std::vector <int> v; 
    v.push_back(1);  // equivalent to v[0] = 1 
} 
11
int arr[] = new int[15]; 

変数arrは、メモリアドレスを保持しています。メモリアドレスには、15個の連続するintが連続しています。インデックス0〜14で参照できます。

PHPでは、このarr [] = 22を実行できます。 これは、配列の次の空のインデックス に22を自動的に追加します。

配列を扱うときに「次へ」の概念はありません。
あなたが欠けていると思う1つの重要なことは、配列が作成されるとすぐに、配列のすべての要素が既に存在することです。それらは初期化されていませんが、すでに存在しています。したがって、配列の要素を「塗りつぶす」わけではありません。既に初期化されていない値で埋められています。配列内の初期化されていない要素をテストする方法はありません。

queueまたはstackまたはvectorなどのデータ構造を使用するように思えます。

6

ダイナミックアレイを実装する場合、私はvectorの方法に完全に同意します。ただし、STLはさまざまな実行時要件に対応する多数のコンテナを提供しています。慎重に選択する必要があります。例:すぐ後ろに挿入する場合は、vectordequeの間で選択できます。

vectorはサイズに柔軟性があるので、要素を追加するために自動的に割り当てを変更することがよくあります。イテレータの無効化については注意してください(はい、ポインタにも当てはまります)。ただし、個々の要素にアクセスするためにoperator[]を使用している限り、あなたは安全です。

+0

+1の自動参照: ) –

1

ご質問のポイントが不明な場合があります。ご了承ください。しかし、アイテムを削除するだけでなく、アイテムを追加するだけの場合は、空の次のスロットに変数を割り当てるだけではいかがですか?配列に新しい値を追加するたびに、次の値を指すように値を増やしてください。 Cでは

++よりよい解決策は、例えば、アレイは動的に拡張することを可能にする標準ライブラリのタイプstd::list<type>を、使用することです:

#include <list> 

std::list<int> arr; 

for (int i = 0; i < 10; i++) 
{ 
    // add new value from 0 to 9 to next slot 
    arr.push_back(i); 
} 

// add arbitrary value to the next free slot 
arr.push_back(22); 
1

あなたがC++で記述している場合 - それはへの道優れていますベクトルなどの標準ライブラリのデータ構造を使用します。

Cスタイルの配列は非常にエラーを起こしやすいので、可能な限り避けるべきです。

2

は、あなたがベクトルを使用する必要はありません空のスロットに

8

を見つけることがヌルを探し、最初にnullにすべての配列要素を初期化します。あなたはプレーンな配列に固執したい場合、あなたはこのような何かを行うことができます。

int arr[] = new int[15]; 
unsigned int arr_length = 0; 

を今、あなたは、配列の最後に要素を追加したい場合は、この操作を行うことができます。

if (arr_length < 15) { 
    arr[arr_length++] = <number>; 
} else { 
    // Handle a full array. 
} 

これはPHP同等のものほど短くて優雅ではありませんが、あなたがしようとしていたことを達成します。将来、配列のサイズを簡単に変更できるようにするには、#defineを使用します。

#define ARRAY_MAX 15 

int arr[] = new int[ARRAY_MAX]; 
unsigned int arr_length = 0; 

if (arr_length < ARRAY_MAX) { 
    arr[arr_length++] = <number>; 
} else { 
    // Handle a full array. 
} 

これにより、後でアレイを管理する方がずっと簡単になります。 15〜100を変更すると、プログラム全体で配列のサイズが適切に変更されます。プログラムがコンパイルされると変更できないので、配列を期待される最大サイズに設定する必要があることに注意してください。たとえば、配列のサイズが100の場合、101要素を挿入することはできません。あなたがこれを行うことができます

あなたは、配列の末尾から要素を使用する場合は、:あなたは先頭から要素を削除できるようにしたい場合は

if (arr_length > 0) { 
    int value = arr[arr_length--]; 
} else { 
    // Handle empty array. 
} 

を、(すなわちFIFO)、ソリューションより複雑になる。最初と最後のインデックスも必要です。

#define ARRAY_MAX 15 

int arr[] = new int[ARRAY_MAX]; 
unsigned int arr_length = 0; 
unsigned int arr_start = 0; 
unsigned int arr_end = 0; 

// Insert number at end. 
if (arr_length < ARRAY_MAX) { 
    arr[arr_end] = <number>; 
    arr_end = (arr_end + 1) % ARRAY_MAX; 
    arr_length ++; 
} else { 
    // Handle a full array. 
} 

// Read number from beginning. 
if (arr_length > 0) { 
    int value = arr[arr_start]; 
    arr_start = (arr_start + 1) % ARRAY_MAX; 
    arr_length --; 
} else { 
    // Handle an empty array. 
} 

// Read number from end. 
if (arr_length > 0) { 
    int value = arr[arr_end]; 
    arr_end = (arr_end + ARRAY_MAX - 1) % ARRAY_MAX; 
    arr_length --; 
} else { 
    // Handle an empty array. 
} 

ここでは、係数演算子(%)を使用してインデックスを折り返します。たとえば、(99 + 1)%100は0(折り返し単位)です。そして(99 + 99)%100は98(折り返し減分)です。これにより、if文を避けてコードをより効率的にすることができます。

また、コードが複雑になるにつれて#defineがどれほど役立つかを素早く確認することができます。残念ながら、このソリューションでも、100個以上の項目(または設定した最大値)を配列に挿入することはできません。 1つの項目だけが配列に格納されていても、100バイトのメモリーを使用しています。

これが他の人に推奨されるベクトルの主な理由です。ベクタはシーンの背後で管理され、構造が拡張されると新しいメモリが割り当てられます。データサイズがすでにわかっている状況では、配列と同じくらい効率的ではありませんが、ほとんどの場合、パフォーマンスの違いは重要ではありません。それぞれのアプローチにはトレードオフがあり、両方を知ることが最善です。

+0

私は間違いなくC++のnewbですが、 'int arr [] = new int [15];'という配列を初期化するときに 'Array initializer is initializer list ' arr'。 –

関連する問題