[解決済み] cでベクターを複製するには?
質問
c++やvector/listが登場する前の時代、より多くのデータを格納する必要があるとき、どのようにして配列のサイズを拡大していたのでしょうか?
どのように解決するのか?
ベクターとリストは、概念的にC++と結びついているわけではありません。同様の構造はC言語でも実装可能で、構文(とエラー処理)が異なるだけです。例えば LodePNG を実装しています。 動的配列 は、std::vector に非常に似た機能を持っています。使い方のサンプルは以下のようなものです。
uivector v = {};
uivector_push_back(&v, 1);
uivector_push_back(&v, 42);
for(size_t i = 0; i < v.size; ++i)
printf("%d\n", v.data[i]);
uivector_cleanup(&v);
見てわかるように、使い方はやや冗長で、異なる型をサポートするためにコードを複製する必要があります。
ナッツ/ストーブ は、どのような型でも動作する、よりシンプルな実装を提供します。
double *v = 0;
arrpush(v, 1.0);
arrpush(v, 42.0);
for(int i = 0; i < arrlen(v); ++i)
printf("%g\n", v[i]);
arrfree(v);
また、ハッシュマップも提供し、C言語のタイプセーフ・コンテナで使用するトリックは、他の汎用コンテナにも適用できる。
これらのメソッドのいずれでも、基礎となるストレージを拡張することができます。
realloc
(下記参照)、または、新しいストレージを
malloc
で古いものを解放し
free
-- と同じです。
std::vector
C++では、メモリが増加します。
しかし、C言語のコードの多くは、reallocで直接メモリを管理することに頼っています。
void* newMem = realloc(oldMem, newSize);
if(!newMem) {
// handle error
}
oldMem = newMem;
なお
realloc
は失敗した場合、null を返しますが、古いメモリはまだ有効です。このような場合、この一般的な(そして間違った)使い方は、メモリをリークします。
oldMem = realloc(oldMem, newSize);
if(!oldMem) {
// handle error
}
と比較すると
std::vector
と上述したC言語の同等品では、単純な
realloc
メソッドは、O(1) の償却保証を提供しません。
realloc
メモリを移動させないようにすれば、より効率的な場合があります。
関連
-
[解決済み】Linuxでexeclp()がどのように動作するのか理解できません。
-
[解決済み】未定義参照 makefile が間違っているのかも?
-
[解決済み] SQLiteのINSERT/per-secondのパフォーマンスを向上させる
-
[解決済み] 1ビットのセット、クリア、トグルはどのように行うのですか?
-
[解決済み] C言語で配列のサイズを決定するにはどうすればよいですか?
-
[解決済み] 配列のすべてのメンバーを同じ値で初期化するには?
-
[解決済み] Project Eulerとの速度比較。CとPythonとErlangとHaskellの比較
-
[解決済み】高放射能環境下で使用するアプリケーションのコンパイルについて
-
[解決済み】C言語の関数ポインタはどのように機能するのですか?
-
[解決済み】NULL終端文字列の根拠は何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】stdinとSTDIN_FILENOの違いは何ですか?
-
[解決済み】strcmpが機能しない
-
[解決済み】C言語におけるファイルスコープでの可変長配列の変更
-
[解決済み】C言語で浮動小数点例外(コアダンプ)発生
-
[解決済み] struct で "warning: useless storage class specifier in empty declaration" (警告: 空の宣言での無駄なストレージクラス指定子)
-
[解決済み】スレッド1:EXC_BAD_ACCESS(コード=1、アドレス=0x0)標準Cメモリ問題
-
[解決済み】LinuxのI_PUSHに相当するもの
-
[解決済み] char pointers: 'char*' から 'char' への無効な変換?
-
[解決済み] Cプログラムで「配列の添え字が整数でない」。
-
[解決済み】c - 警告:関数 'printf'の暗黙の宣言