🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

3回答

391閲覧

vectorを一時的に取る方法

the_hoots_under

総合スコア33

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2019/09/23 05:56

動的配列を、ponterでとってnewするというやり方で取ると、いらなくなると途中でdeleteでメモリ解放ができてスッキリします。
一方、vectorで取ると、クラスインスタンスを普通に定義してとっていることになるので、main関数の最後まで残ります。
どうにかして、vectorを一時的に確保するみたいなことってできないんですかね。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2019/09/23 05:57

ポンターって何ですか?
maisumakun

2019/09/23 05:58

コードの形で示していただけないでしょうか。
the_hoots_under

2019/09/23 06:00

>コードの形で示していただけないでしょうか。 それは、この質問がそういう風にしたほうが良いとことですか。 それとも、ここでは基本的に具体的にコードのない質問をしないほうが良いということでしょうか。
Zuishin

2019/09/23 06:00

> 動的配列を、ponterでとってnewするというやり方で取る ってどういうことですか?
the_hoots_under

2019/09/23 06:06

うーん、C++よくわかっていないのにいい加減な質問をしてごめんさい。 とりあえずやりたいことは、vectorを途中でとって、途中でメモリ解放をする ことができるか知りたかっただけす。 久々にプログラミングしているんで色々と概念的なことも具体的なことも忘れていてごっちゃになっています。 普通に int *var; var = new int[10]; でとって、最後に delete[] var; ってできるじゃないですか。いらなくなったらdeleteできるじゃないですか。 vectorもdeleteみたいなことをしたいわけです。
Zuishin

2019/09/23 06:11

日本語が曖昧だからコードが必要ということです。回答がついています。
the_hoots_under

2019/09/23 06:14

承知しました。 自分では変なことを言っているつもりはなかったのですが、だいぶあべこべなことを言っていたのですね。 大変失礼しました。
Zuishin

2019/09/23 08:04

「あいまい」と読みます。
guest

回答3

0

使う所だけブロックで囲めば?

c++

1{ 2 std::vector<int> ivec; 3 ・・・いろいろ・・・ 4} 5

投稿2019/09/23 06:38

cateye

総合スコア6851

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

不要になった時点でstd::
vector::
clear
を使って要素をすべて削除すればよいと思います。

投稿2019/09/23 06:03

nomuken

総合スコア1627

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fana

2019/09/23 06:14

clear()で要素は解体されるでしょうけど,質問者が気にかけている「メモリ」についてはshrink_to_fit()なりが必要なのでは.
the_hoots_under

2019/09/23 08:36

そうですね。clear()してshrink_to_fit()すると動的配列のdelete[]に対応するようです。
guest

0

ベストアンサー

こんにちは。

C++11以降ならばshrink_to_fit()を使ってstd::vector<>の不要メモリを開放できます。

C++

1#include <iostream> 2#include <vector> 3 4int main() 5{ 6 std::vector<int> x={1, 2, 3}; 7 std::cout << "size=" << x.size() << " capacity=" << x.capacity() << "\n"; 8 x.clear(); 9 std::cout << "size=" << x.size() << " capacity=" << x.capacity() << "\n"; 10 x.shrink_to_fit(); 11 std::cout << "size=" << x.size() << " capacity=" << x.capacity() << "\n"; 12}

wandbox

投稿2019/09/23 06:07

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

the_hoots_under

2019/09/23 06:16

なるほど。 x.shrink_to_fit(); を使うと きっと、vectorの内部でvectorのもつメンバ変数(動的配列のポインタ)がdeleteされて、capacityが0と表示されるのでしょうか。 一方、clear()ではcapacityが0になっていません。 clear()は一体何をやっているのでしょうか?
Chironian

2019/09/23 06:22

clear()は実行結果の通り要素数をクリアします。確保しているメモリは開放しません。 shrink_to_fit()の内部実装は把握していませんが、使っているメモリは開放しませんので、全てのメモリを開放したい場合はclear()してshrink_to_fit()することになります。
the_hoots_under

2019/09/23 06:45

うーん、、ちょっと私には難しいです。。 clear() がvectorの要素数を0にするものですか? shrink_to_fit()は何ですか? size()が要素数ですね。 vectorのキャパシティって何ですか? clear()した後size()が0になり、キャパシティの値が変わりません。 その後、shrink_to_fit()することで、キャパシティの値が0になりました。 shrink_to_fit()はキャパシティを0にする関数なんですね。 とするとやっぱりキャパシティが何だかわかりません。 よってshrink_to_fit()が何をしているのか良くわかりません。
SaitoAtsushi

2019/09/23 08:01

確保している領域を伸ばしたり縮めたりするのは結構コストの大きい操作です。 なので、実際に要素を格納している大きさとは別に vector ではあらかじめ余裕をもって大きめの領域が確保されることがあります。 その余裕の分も含めた領域が「キャパシティ」です。 まだ何も入れていなくても場所だけは確保されていることもありますし、格納されている要素を解放して見かけ上のサイズを縮めても場所そのものはそのままということもあるのです。 shrink_to_fit は実際に格納されている要素数ぴったりにキャパシティを調整するということです。
Chironian

2019/09/23 08:25 編集

the_hoots_underさん SaitoAtsushiさんのフォローの通りです。 しかし、根本的な部分で勘違いされているように思います。 ポインタで取ろうがstd::vector<>で取ろうが、当該ローカル変数はメイン関数の最後まで残りますよ。 int main() {  std::vector<int> vec(10);  int* ponter = new int[10];  delete[] ponter;  ponter=nullptr;  vec.clear();  // ponterもvecも最後まで有効。  // ponter変数の内容nullptr、vec変数に要素は1つもない。 } もし、変数のスコープ(有効範囲)を限定したいのであれば、{}で囲うことが可能です。 int main() {  int* ponter = new int[10];  delete[] ponter;  ponter=nullptr;  {   std::vector<int> vec(10);   // vecを使う処理  }  // ponterのみ最後まで有効。ここではvecは使えない。 }
the_hoots_under

2019/09/23 08:35

>SaitoAtsushi なるほど size : 見かけ上の要素数 capacity:実際のvectorが確保しているメモリサイズ で、clearだと見かけ上の部分しか制御できないというわけですね。とても勉強になります。 >SaitoAtsushi,Chironian 確かに色々とごっちゃになっていたかもしれません。 結局私が知りたかったなと思うのは、動的配列delete[]に対応するvectorの関数でしたので、 これはclear()してshrink_to_fit()ということですね。 よくわかりました。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問