【问题标题】:What is difference between resize() and reserve()? [duplicate]resize() 和 reserve() 有什么区别? [复制]
【发布时间】:2019-03-14 18:11:59
【问题描述】:
#include<iostream>
using namespace std;
#include<vector>
#include "s.h"


template<class T> 
void f(vector<T> a)
{
    cout << "size  " << a.size() << endl;
    cout << "capacity  " << a.capacity() << endl << endl;
}


int main()
{
    vector<int> s(10,5);
    f(s);
    s.resize(50);
    f(s);
    s.reserve(150);
    f(s);
    return 0;
}

我认为 resize() 会改变大小,而 reserve() 会改变容量,但在我的示例中,reserve() 不会改变容量,为什么? 还有我的第二个问题——assign() 是什么意思?我可以对 operator=() 做同样的事情吗?

// 10 10
// 50 50 
// 50 50

【问题讨论】:

标签: c++ vector stl


【解决方案1】:

当您将向量传递给函数时,您正在创建向量的副本。更改f 的定义以通过引用传递向量,您会看到它的行为符合您的预期:

void f(const vector<T>& a)

打印

size  10
capacity  10

size  50
capacity  50

size  50
capacity  150

【讨论】:

  • 你评论了,你没有回答。
  • 更具体地说,复制向量并不一定复制容量。它只复制内容。
  • 谢谢,我要小心:(
【解决方案2】:

复制矢量会复制其内容。并且容量不被视为向量内容的一部分。由于您的 f 函数复制了它的参数,因此您没有传递实际的向量;你正在传递一份副本。容量设置为实现定义值的副本。

【讨论】:

    【解决方案3】:

    reserve(...) 的调用实际上可能有效,但您只是不知道。当你调用你的函数时

    void f(vector<T> a)
    

    您正在复制您的原始向量到新向量a;那时我怀疑该库创建了一个具有最小容量的向量。如果您尝试将函数的签名更改为

    void f(vector<T> const& a)
    

    您可能会看到您所期望的结果,因为该函数将在原始矢量对象而不是副本上进行操作。

    【讨论】:

      【解决方案4】:

      reserve() 总是增加容量,而 resize() 可以做任何事情,包括以某种方式破坏您的数据及其危险。 调用 reserve() 以获得比实际大小更小的容量可能不会导致任何问题或更改,而使用小于大小的值调用 resize() 只会裁剪数据或使用高于实际大小的值调整大小当然会增加向量大小本身

      【讨论】:

      • 这是标题问题的唯一实际答案,点赞
      猜你喜欢
      • 2021-02-18
      • 1970-01-01
      • 2015-11-23
      • 2013-02-13
      • 2011-04-26
      • 2016-09-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多