質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.50%
GCC

GCCはGNU Compiler Collectionの略です。LinuxのC言語コンパイラのデファクトスタンダードであり、数多くの他言語やプラットフォームサポートもします。

C++

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

Q&A

解決済

2回答

667閲覧

C++のVectorの=(等式)での要素のコピーについて

DAISUKE45

総合スコア18

GCC

GCCはGNU Compiler Collectionの略です。LinuxのC言語コンパイラのデファクトスタンダードであり、数多くの他言語やプラットフォームサポートもします。

C++

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

0グッド

0クリップ

投稿2020/04/21 09:37

C++でのVectorについて、**=(等式)**でのコピーはどのようなコピーになっているのか?
という質問です。

実行環境は、
C++17、gcc、VScodeのcode runnerを用いています。

以下のコードを試し、sortを行ったところ、Vectorのコピーの仕方で違いが出たのでわかる方いましたら説明していただきたいです。

Cpp

1 vector<int> P = {1, 2, 3}; 2 int n = P.size(); 3 vector<int> Q(n + 2, 0), R(n + 2, 0); 4 Q = P; 5 6 for (int i = 0; i < n; i++) 7 { 8 R[i] = P[i]; 9 } 10 11 cout << "&Q : " << (size_t)&Q << endl; 12 cout << "&P : " << (size_t)&P << endl; 13 cout << "&R : " << (size_t)&R << endl; 14 15 sort(Q.begin(), Q.end()); 16 sort(R.begin(), R.end()); 17 cout << endl; 18 19 cout << "Q = Pで要素をコピーした場合" << endl; 20 for (int i = 0; i < n + 2; i++) 21 { 22 cout << Q[i] << ' '; 23 } 24 cout << endl; 25 cout << endl; 26 27 cout << "Q[i] = R[i]で要素をコピーした場合" << endl; 28 29 for (int i = 0; i < n + 2; i++) 30 { 31 cout << R[i] << ' '; 32 } 33 cout << endl;

cpp

1 &Q : 140732754266592 2 &P : 140732754266560 3 &R : 140732754266624 4 5 Q = Pで要素をコピーした場合 6 1 2 3 0 0 7 8 Q[i] = R[i]で要素をコピーした場合 9 0 0 1 2 3

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

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

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

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

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

guest

回答2

0

ベストアンサー

Q = Pで要素をコピーした場合

これはvectorまるごとのコピーになりますので、Qの要素数はn個しかありません。そして、[]演算子で範囲外をアクセスした場合、未定義の動作となります。何が起きても文句は言えません

投稿2020/04/21 09:43

maisumakun

総合スコア145121

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

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

DAISUKE45

2020/04/24 02:31

vectorまるごとでのコピーになるんですね。 ありがとうございます。 もっと勉強します。
guest

0

2つの for (int i = 0; i < n + 2; i++) を
for (int i = 0; i < Q.size(); i++) と
for (int i = 0; i < R.size(); i++) にしないといけません。

Q.size() は最初 5 だったのが、Q = P; により 3 になりました。
R.size() は 5 のまま変わらず、R[i] = P[i]; により 3つの要素だけが変更されました。
残りの R[3], R[4] は 0 のままなので、sort すると先頭に来ます。

投稿2020/04/21 12:18

kazuma-s

総合スコア8224

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

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

DAISUKE45

2020/04/24 02:35

要素が変更されるという知見がなかったため非常に勉強になりました。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問