代码之家  ›  专栏  ›  技术社区  ›  Chi-fung LAM

C语言中的“自动”声明问题++

  •  1
  • Chi-fung LAM  · 技术社区  · 7 年前

    我在使用上有问题 auto 声明。我在Visual Studio 2017中编写了一个程序,如下所示:

    #include "stdafx.h"
    #include <stdio.h>
    #include <iostream>
    #include <vector>
    
    using namespace std;
    
    class MyClass
    {
    public:
        struct mystruct {
            vector<int> vi;
        };
        vector<mystruct> TheStructV;
        void AddStructV() {
            TheStructV.push_back(mystruct());
        };
    };
    
    int main()
    {
        MyClass MyObj[3];
        for (int a = 0; a < 3; a++) {
            MyObj[a].AddStructV();
            for (int i = 1; i <= 5; i++) {
                MyObj[a].TheStructV[MyObj[a].TheStructV.size() - 1].vi.push_back(i * 10 + idx);
            }
            idx++;
        }
        for (int b = 0; b<3; b++) {
            cout << "MyObj[" << b  << "] struct vector size:" << MyObj[b].TheStructV.size() << endl;
            cout << "MyObj[" << b  << "] struct vi size:" << MyObj[b].TheStructV[0].vi.size() << endl;
        }
        for (int i = 0; i < 3; i++) {
            cout << "MyObj[" << i  << "].vi:";
            for (int j = 0; j < 5; j++) {
                cout << MyObj[i].TheStructV[0].vi[j] << "-";
            }
            cout << endl;
        }
        return 0;
    }
    

    按预期工作,输出为:

    MyObj[0] struct vector size:1
    MyObj[0] struct vi size:5
    MyObj[1] struct vector size:1
    MyObj[1] struct vi size:5
    MyObj[2] struct vector size:1
    MyObj[2] struct vi size:5
    MyObj[0].vi:11-21-31-41-51-
    MyObj[1].vi:12-22-32-42-52-
    MyObj[2].vi:13-23-33-43-53-
    

    但是,如果我将代码更改为:

    #include "stdafx.h"
    #include <stdio.h>
    #include <iostream>
    #include <vector>
    
    using namespace std;
    
    class MyClass
    {
    public:
        struct mystruct {
            vector<int> vi;
        };
        vector<mystruct> TheStructV;
        void AddStructV() {
            TheStructV.push_back(mystruct());
        };
    };
    
    int main()
    {
        MyClass MyObj[3];
    
        int idx = 1;
        for (auto M : MyObj) {
            M.AddStructV();
            for (int i = 1; i <= 5; i++) {
                M.TheStructV[M.TheStructV.size() - 1].vi.push_back(i * 10 + idx);
            }
            idx++;
        }
        for (int b = 0; b<3; b++) {
            cout << "MyObj[" << b << "] struct vector size:" << MyObj[b].TheStructV.size() << endl;
            cout << "MyObj[" << b << "] struct vi size:" << MyObj[b].TheStructV[0].vi.size() << endl;
        }
        idx = 1;
        for (auto MC : MyObj) {
            cout << "MyObj[" << idx - 1 << "].vi:";
            for (auto thisStruct : MC.TheStructV) {
                cout << thisStruct.vi[0] << "-";
                cout << thisStruct.vi[1] << "-";
                cout << thisStruct.vi[2] << "-";
                cout << thisStruct.vi[3] << "-";
                cout << thisStruct.vi[4] << "-";
            }
            cout << endl;
            idx++;
        }
    
        return 0;
    }
    

    它编译没有问题,但运行时出错,输出为:

    MyObj[0] struct vector size:0
    

    程序卡在这里。

    看来我错过了什么。我甚至试着替换 auto M 具有 MyClass M ,但仍然是相同的问题。

    1 回复  |  直到 7 年前
        1
  •  10
  •   Cory Kramer    7 年前

    这条线将 复制 您的对象的

    for (auto M : MyObj)
    

    将其更改为引用,以便可以修改它

    for (auto& M : MyObj)