90440


2次元配列から1次元配列のメンバ関数に触りたいのですが、動作しません。  
直接1次元配列から呼べば動いてくれます。  
「そういう仕様だから当然だ」と言われればそれまでですが、  
参考にした
[サイト](https://qiita.com/ysuzuki19/items/df872d91c9c89cc31aee#2%E6%AC%A1%E5%85%83%E9%85%8D%E5%88%97-3)
でも同じ記法が載っていたので諦めきれていない状況です。

[code]

    #include <iostream>
    #include <vector>
    
    int main(void) {
      std::vector<int> v;
      std::vector<std::vector<int>> vv {v};
      //動く
      v.push_back(1);
    　//動かない     
      vv[0].push_back(2);
      for(int i=0;i<v.size();i++){
        std::cout << v[i];
      }
      return 0;
    }
    
[/code]

上記のコードの出力が 1 になってしまいます。  
begin()やend()も正しく処理されず例外が発生します。  
上記のコードをコンパイル、実行してもエラーは出ませんでした。

  1. 何故うまく動かないのか
  2. 近いコードを書くのにどのような方法があるか

教えてほしいです。

環境 OS: Windows 10 19044.1826 IDE: Visual Studio Code 1.70.0 コンパイラ: Clang
14.0.1


CC BY-SA 4.0
2022-08-08T14:00:09.463
90438
2022-08-09T00:41:55.980
2022-08-08T14:34:46.727
3060
53912
question
c++
vectorの二次元配列からメンバ関数を動かしたい


「1. 何故うまく動かないのか」に対する回答だけ。

[code]

    std::vector<int> v;
    std::vector<std::vector<int>> vv {v};
    
[/code]

これでは`vv[0]`に`v`をコピーすることになってしまうため、コピーした後にいくら`v`を変更しても`vv[0]`は変更されませんし、`vv[0]`を変更しても`v`は変更されません。


CC BY-SA 4.0
2022-08-08T14:53:36.917
90439
2022-08-08T14:53:36.917
7291
90438
answer


「2.近いコードを書くのにどのような方法があるか」についてです。  
この方針が良いかどうかはさておき、やりたいことはこういうことでしょうか。

[code]

    #include <iostream>
    #include <vector>
    
    int main(void) {
        std::vector<int> v;
        std::vector<std::vector<int>* > vv {&v};
        //動く
        v.push_back(1);
        // 一応動く
        vv[0]->push_back(2);
        for(int i=0;i<v.size();i++){
            std::cout << v[i] << std::endl;
        }
        return 0;
    }
    
[/code]

スコープとかも気にしないといけませんし、管理が面倒そうですが、どちらのvectorを操作しても値が入るようになります。


CC BY-SA 4.0
2022-08-09T00:35:46.847
90440
2022-08-09T00:41:55.980
2022-08-09T00:41:55.980
9515
9515
90438
answer