无法初始化矢量的大小以及内容

时间:2015-04-11 23:46:59

标签: c++ vector

以下代码只是孤立的问题。我不仅要保留向量的大小,还要初始化内容,以便在大小范围内的向量元素突然分配一个值时,它不会抛出向量下标超出范围错误。我基本上替换了在大量代码中使用的固定大小的数组,我想要相同的功能,而不必添加" item.push_back(newItem)"整个文件。我尝试在刚添加的Node构造函数中放置一个for循环,但由于某种原因,.push_back()方法无法识别。

我如何不仅保留大小,还初始化构造函数中的内容?

#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <string>
#include <vector>

using std::cout;
using std::endl;
using std::string;
using std::vector;

int maxSize = 3;

struct Item{
    string key;
    string value;
};

struct Node{
    int count;

    vector<Item> items;

    Node()
    {
        items.reserve(maxSize + 1);
    }
};

int main(int argc, char *argv[])
{
    Item item;
    item.key = "Hi";
    item.value = "there";

    Node *p = new Node();

    p->items[1] = item; // Error: vector subscript out of range

    cout << p->items[1].key << " " << p->items[1].value << endl;

    return 0;
}

2 个答案:

答案 0 :(得分:2)

您正在寻找resize而不是reserve

答案 1 :(得分:2)

为了优化,保留仅分配底层内存。如果你不知道你需要它,你就不需要它。如果你不知道你需要它,并且你写了它,你就不应该这样做。

尝试做的是让向量实际占用大小,并填充可以通过operator[]立即访问的元素。

为此,请写下resize而不是reserve

事实上,既然你是在容器的构造函数中对一个成员这样做的,那么你真正要做的就是通过调用正确的构造函数来初始化向量:

struct Node
{
    int count;
    vector<Item> items;

    Node()
      : items(maxSize + 1)
    {}
};