【问题标题】:Why do I see size of vector as zero?为什么我看到向量的大小为零?
【发布时间】:2014-02-21 07:05:12
【问题描述】:
void pre_process(string& pattern, vector<int>& c)
{
    c.reserve(pattern.length());
    c[0] = -1;
    c[1] = 0;
    for(int i=2; i<pattern.length(); ++i)
    {
        if(pattern[c[i-1]] == pattern[i-1])
            c[i] = c[i-1]+1;
        else
            c[i] = 0;
    }
    cout << c.size() << endl; //why the size is zero here?

}

在向量中保留空间后,我将值分配给向量的不同位置。所以不应该增加尺寸吗?

将vector用作定长容器的正确方法是什么?

【问题讨论】:

  • “我正在为向量的不同位置赋值”——不,你不是;您正在调用 UB。 reserve 没有 resize()
  • 简短摘要:您看到向量的大小为零,因为向量的大小零。

标签: c++ vector stl containers


【解决方案1】:

因为std::vector::reserve 不会调整向量的大小。它只是为向量的数据重新分配更大的内存块(并在必要时从原始数据中复制元素)。

为此,您需要std::vector::resize

c.resize(pattern.length());

目前,您正在越界访问c

或者,您可以保留调整大小的调用并使用 push_back 而不是 operator[]

c.reserve(pattern.length());
c.push_back(-1);
c.push_back(0);

【讨论】:

  • std::vector::reserve 的用例场景是什么?如果它只是重​​新分配更多不可用的内存,那么拥有这样一个功能有什么意义呢?
  • 当分配的内存少于需要时,我是否在使用 push_back 时节省了重新分配?
  • @aj_ 如果您知道向量将达到一定大小,但您想将元素推入其中,reserve 是一个不错的选择。但是,如果您将大小调整为太小,则在某些时候您将需要重新分配。如果你什么都不做,只是推入默认构造的向量,你会得到更多的重新分配。
  • 所以本质上 Reserve() 后跟 push_back() 和 resize() 后跟 operator[] 是等价的?
  • @aj_ 不完全。 resize 将就地构造对象,而对operator[] 的调用将修改这些对象。 reserve 不创建任何对象,它只是为它们保留空间。所以最终结果是一样的,但是语义和幕后发生的事情是不同的,并且可能会影响性能。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-20
  • 1970-01-01
  • 1970-01-01
  • 2015-04-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多