私は動的に作成された整数の配列を持っています。インデックス%3 == 0.(たとえば、3,6,9、...)の要素をすべて削除しなければなりません。だから、配列のサイズを減らす最善の方法は何ですか? malloc
私はメモリの同じ部分にreallocを使うことができますが、new
の演算子はどうですか?このようにすること。すべての要素を左にスライドさせ、すべての要素をゼロにしますか?新規および配列サイズ
答えて
新しい小さな配列を割り当ててから要素をコピーするだけです。このようなもの(これは0のインデックスにある要素を含みます):
int* array = new int [original_size];
// fill array
size_t new_size = original_size - original_size/3 - 1; // i think i got this right, untested
int* new_array = new int [new_size];
for (int i = 0, int j = 0; i < original_size; i++)
{
if (i % 3 == 0)
{
new_array[j] = array[i];
j++
}
}
delete [] array;
array = new_array;
new_array = nullptr;
もちろん、要素を左にシフトしてシフトすることができます。しかし、new[]
によって割り当てられた配列の一部を削除することはできません。
これは練習問題で、STLを使用することはできませんので、自分で単純なベクトルクラスを実装しようとしないのはなぜですか?
私はそれがちょうど 'original_size - original_size/3'だと思います。サイズは0,1,2,3,4,5,6でチェックしてください。 –
また、OPは「これは運動の一部です」と言っていますので、私は宿題のように扱い、ストレートコードを避けます。 –
@MooingDuck見てみましょう、配列0..6(7要素)から要素0、要素3、要素6、要素3を削除します。新しい配列には4つの要素があるので、7 - 7/3 = 5は正しくありません。 – jrok
#include <algorithm>
#include <iostream>
#include <vector>
bool IsDividedByThree (int i) { return ((i%3)==0); }
int RandomNumber() { return (rand()%100); }
int main()
{
std::vector<int> myInts(50);
std::generate(myInts.begin(), myInts.end(), RandomNumber);
std::copy(myInts.begin(), myInts.end(), std::ostream_iterator<int>(std::cout, " "));
myInts.erase(std::remove_if(myInts.begin(), myInts.end(), IsDividedByThree), myInts.end());
std::copy(myInts.begin(), myInts.end(), std::ostream_iterator<int>(std::cout, " "));
}
STLはあなたのためにすべてを気にかかることをとても素敵ではないですか?
フム1は、STLを使用しないを余儀なくされているコメントを、表示されませんでした。
Cバージョン:
int *temp = new int[NEW_SIZE];
memcpy(temp , old_array, size_of_old_array * sizeof(int));
delete[] old_array;
old_array = temp;
- アレイ動的
- を作成し、新しいサイズ
- で新しい配列を作成
- 二番目の配列に最初から要素をコピー、削除最初の配列
- 最初の配列へのポインタを2番目の配列にリダイレクト
これらの回答はすべてです。したがって、配列サイズを小さくする最も良い方法は何ですか? - 私はあなたがすでにあなたの問題の残りの部分を解決する方法を知っていると仮定しました。
データ要素を0に設定するだけで解放しないでください。また、サイズ変更された配列に新しいメモリを割り当てるときは、前のメモリからすべての要素をコピーする必要があります。
リンクリストとして実装することをお勧めします。
placement new operatorはC++で使用できます。 (が必要です)。たとえば、
#include <new>
int main(int argc, char **argv) {
double *b = new double[10];
new(b) double[8];
delete [] b;
}
まず第一に、それは問題を解決しません。第二に、それは本当に混乱しています。第三に、それは未定義の振る舞いです。 –
@MooingDuck最初の2つの理由は聞こえます。三番目はどうですか?なぜこれが未定義の動作につながるのでしょうか?もっと説明していただけますか?ありがとう。 –
私は電話から標準を引用することはできませんが、定義されていない動作は、既に構築されたオブジェクトのコンストラクタを呼び出します(デストラクタも同じです)。実際には、charsは例外である可能性があります。そうであれば、他のプリミティブやPODが例外である可能性があります。これがUBかどうかを調べるには、標準をチェックする必要があります。 –
- 1. Dojo DataGridおよび列のサイズ変更
- 2. PHP、配列、および参照
- 3. PHP配列、シリアライズ、およびシリアル化
- 4. C - 配列、ソート、および変更
- 5. 読むディレクトリおよび配列
- 6. b2bodyおよびb2固定配列
- 7. C#ビットマップイメージ、バイト配列およびストリーム!
- 8. ArrayaccessおよびネイティブPHP配列関数
- 9. サイズ変更およびCSS
- 10. ポインタ、配列、および構造体(およびメモリの割り当て)?
- 11. 新規作成と削除および挿入パターン
- 12. 新規および削除char *例外が発生する
- 13. Androidアプリのライセンス交渉新規および古い疑問
- 14. エンティティフレームワーク、WCFおよび更新
- 15. angular2 RouteParams、直列化、および複雑なオブジェクトや配列
- 16. 列内の行および/またはクロス集計配列を
- 17. Rails、ActiveRecord、およびPSQL:配列を列に保存する
- 18. Javaおよび正規表現
- 19. Bison(およびフレックス)のコーディング規則
- 20. 、検索および正規表現
- 21. Bash配列:配列内の各要素に追加およびプリペンド
- 22. 列挙ダイナミックメンバー(および値)
- 23. std :: vector reserve()およびpush_back()はresize()および配列インデックスより高速ですが、なぜですか?
- 24. PHP、in_arrayおよび配列内の高速検索(最後)
- 25. int配列は、Javaでデータグラムソケットプログラミングで送信および受信
- 26. JavaScript数学(パラメータ渡し、配列、および「適用」メソッド)
- 27. ギザギザの配列をシリアライズおよび逆シリアル化するC#
- 28. SELECT WHEREグループID IN配列ORDER BYおよびグループ
- 29. VBで配列を追加および削除する方法
- 30. XMLからPHPへの配列、およびHTMLタグ
STLを使用すると、これがすべて実行されます。 –
一般に、 'realloc'はメモリの同じ部分を再利用しません。 –
C++標準ライブラリを使用します。それはあなたのためにすべてのことを行い、何十年も非難されているわけではありません。 –