如何初始化结构体中的向量成员?

3

假设我有一个包含向量成员的结构体。在构造函数中,我希望将其设置为空。但是稍后我要能够将元素添加到其中。在将其设置为NULL后,如何初始化这个向量?

struct structName {
    vector<int> vec;
    structName() {
        vec = NULL
    }
    void set(int);
}

void structName::set(int n) {
    // What do I put here?
    vec.push_back(n);
}

感谢您的帮助!
4个回答

3

已经通过默认构造函数初始化,如果需要调用不同的构造函数,请使用初始化列表。

请记住,这是C++,而不是Java/C#/其他语言。一个对象为空没有任何意义(好吧,在那些语言中也是如此,但请继续阅读)。它不可能发生。在Java和类似的语言中,你有变量,它们是对对象的引用,这些引用(而不是对象!)可能为空或非空。

在C++中不是这种情况。对象和指向它们的指针之间存在严格的区分(指针当然可以为空或指向无效的内存位置)。


0

将向量初始化为NULL没有任何意义。也许你和指针混淆了。如果你想将向量初始化为空向量,那么这会自动发生。换句话说,就像这样

struct structName {
    vector<int> vec;
    structName() {
    }
    void set(int);
}

void structName::set(int n) {
    vec.push_back(n);
}

谢谢,那很清晰了。我正在使用它来制作散列表。您认为空向量会占用太多空间吗? - user1789919
我期望(在32位机器上)一个空向量占用12个字节。但如果你想测试一下,可以尝试使用sizeof(vector<int>) - john
@john:在VS2010中是20,只是提供一个信息。user17...向量不是很大。它们的后备数据存储可以变得很大,但向量本身很小。 - Ed S.
@EdS。在调试模式下是20字节,但在发布模式下是16字节。仍然有点失望。我认为一个好的实现只需要使用12个字节。当然,关于支持数据的观点是正确的,但我希望默认构造的空向量在分配数据时精确地为零字节。 - john
@john:天啊!我竟然把它留在Debug模式下了...当然,对于一个空向量,我也会有同样的期望。 - Ed S.
根据此链接,Visual Studio 2012的std::vector大小为12。 - chris

0

向量的默认构造函数会将其设置为最简单的状态:无内容。因此,只需让它保持不变。


0

我觉得你可能会像在Java中一样考虑C++的对象。不要这样做,它们是完全不同的东西。

在C++中,对象不像Java中那样是引用,因此将它们置为空并没有意义。事实上,尝试使用vec = NULL是一个错误,因为NULL实际上只是0。

相反,只需删除vec = NULL这行代码,它就可以正常工作了。向量将被默认构造为空,并且您不需要进行任何其他初始化。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接