初始化结构的向量

时间:2014-06-11 05:56:14

标签: c++

初始化结构矢量时遇到问题。

简化代码:

#include <vector>
#include <iostream>

int main() {

struct info
{
    int num;
    bool b;

    info()
        : num(1), b(false){}
};

std::vector<info> stuff = std::vector<info>(10);

//Try 1
stuff[5] = info();
stuff[5].num = 4;

//Try 2
info inf;
inf.num = 5;
stuff.push_back(inf);

std::cout << "\nstuff[5].num=" << stuff[5].num
                    << "\nstuff[10].num=" << stuff[10].num;
return 0;
}

不确定为什么这不起作用。看起来它应该很简单,但每次尝试后所有Visual Studio调试器都有:stuff [(any)] = {num = ??? b = ???}

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

以下内容不适用于评论。

该程序无法正常运行,因为它不完整。始终给出一个显示问题的完整最小示例。打印出以下程序

stuff[5].num=4
stuff[10].num=5

正如所料。

#include <iostream>
#include <vector>

struct info
{
    int num;
    bool b;

    info()
        : num(1), b(false){}
};

int main() {
    std::vector<info> stuff = std::vector<info>(10);

    //Try 1
    stuff[5] = info();
    stuff[5].num = 4;

    //Try 2
    info inf;
    inf.num = 5;
    stuff.push_back(inf);

    std::cout << "\nstuff[5].num=" << stuff[5].num
                        << "\nstuff[10].num=" << stuff[10].num;
    return 0;
}

这个问题非常有趣。从OP告诉我们的内容来看,原始代码是这样的:

#include <iostream>
#include <vector>

int main() {

    struct info
    {
        int num;
        bool b;

        info()
            : num(1), b(false){}
    };

    std::vector<info> stuff = std::vector<info>(10);

    //Try 1
    stuff[5] = info();
    stuff[5].num = 4;

    //Try 2
    info inf;
    inf.num = 5;
    stuff.push_back(inf);

    std::cout << "\nstuff[5].num=" << stuff[5].num
                        << "\nstuff[10].num=" << stuff[10].num;
    return 0;
}

/*
    Local Variables:
    compile-command: "g++ -std=c++11 test.cc -o a.exe"
    End:
 */

如果使用g++编译并且没有选项-std=c++11,则会收到以下错误消息:

g++ -g /temp/test.cc -o /temp/test.exe && /temp/test.exe
/temp/test.cc: In function ‘int main()’:
/temp/test.cc:15:18: error: template argument for ‘template<class> class std::allocator’ uses local type ‘main()::info’
  std::vector<info> stuff = std::vector<info>(10);
                  ^
/temp/test.cc:15:18: error:   trying to instantiate ‘template<class> class std::allocator’
/temp/test.cc:15:18: error: template argument 2 is invalid
...

但是,N3797的Section [class.local]告诉我们本地类没有任何问题。因此,我使用-std=c++11 g++选项进行了重试。 这编译得很好,并给出了预期的结果。

另外使用-g标志进行编译以包含调试信息,并且调试与g++一起使用。

以下gdb会话的部分输出刚好在<<运算符之前运行:

(gdb) print stuff[5]
$2 = (__gnu_cxx::__alloc_traits<std::allocator<main()::info> >::value_type &) @0x60003c388: {num = 4, b = false}
(gdb) print stuff[10]
$3 = (__gnu_cxx::__alloc_traits<std::allocator<main()::info> >::value_type &) @0x60003c3b0: {num = 5, b = false}

正如人们所看到的,它会给出预期的结果。

Visual Studio 2010编译它并且控制台中的输出很好。在调试器中没有什么可看的。 stuff - 成员在调试器中是废弃的,即使程序是在调试模式下编译的。