C++ 将std向量重新指定给默认构造函数向量是一种很好的擦除方法吗?

C++ 将std向量重新指定给默认构造函数向量是一种很好的擦除方法吗?,c++,vector,C++,Vector,关于清除一个std::vector有很多问题和答案,我想知道为什么在我读到的所有问题和答案中,没有人只说: existingVector=std::vector() 这不是清除向量的简单方法吗?确实很简单,但有一种更简单、更直接的方法: existingVector.clear(); 你也可以这样做: existingVector.resize(0); 但我喜欢第一种方法,因为它完全按照它所说的做 类似地,我更喜欢检查if(myVec.empty())而不是if(myVec.size()==

关于清除一个
std::vector
有很多问题和答案,我想知道为什么在我读到的所有问题和答案中,没有人只说:

existingVector=std::vector()


这不是清除向量的简单方法吗?

确实很简单,但有一种更简单、更直接的方法:

existingVector.clear();
你也可以这样做:

existingVector.resize(0);
但我喜欢第一种方法,因为它完全按照它所说的做

类似地,我更喜欢检查
if(myVec.empty())
而不是
if(myVec.size()==0)

更新:如果您希望“真正重置”,即您不仅希望大小变为0,还希望容量变为0,那么您可以做几件事

  • 缩紧

    vec.clear();
    vec.shrink_to_fit();
    
  • 不过,正如注释正确指出的那样,shrink_to_fit也是一个非绑定请求,编译器可能会忽略它

  • 与新构造的向量交换

    vector<whatever>().swap(vec);
    
    vector().swap(vec);
    

  • 这确实很简单,但有一种更简单、更直接的方法:

    existingVector.clear();
    
    你也可以这样做:

    existingVector.resize(0);
    
    但我喜欢第一种方法,因为它完全按照它所说的做

    类似地,我更喜欢检查
    if(myVec.empty())
    而不是
    if(myVec.size()==0)

    更新:如果您希望“真正重置”,即您不仅希望大小变为0,还希望容量变为0,那么您可以做几件事

  • 缩紧

    vec.clear();
    vec.shrink_to_fit();
    
  • 不过,正如注释正确指出的那样,shrink_to_fit也是一个非绑定请求,编译器可能会忽略它

  • 与新构造的向量交换

    vector<whatever>().swap(vec);
    
    vector().swap(vec);
    

  • 分配是可以的,但是可以允许优化实现保留原始内存缓冲区,以避免重新分配

    强制释放向量的传统智慧是“用临时变量交换”:

    #包括
    #包括
    int main(){
    std::载体a(256);
    std::vector().swap(a);
    
    std::cout分配是可以的,但是可以允许优化实现保留原始内存缓冲区,以避免重新分配

    强制释放向量的传统智慧是“用临时变量交换”:

    #包括
    #包括
    int main(){
    std::载体a(256);
    std::vector().swap(a);
    
    std::为什么不简单地使用
    现有的vector.clear()ῥεῖ 请参阅我对其中一个答案的评论。我想这个问题缺少一些关于您真正想要做什么的细节(例如,重置容量)。请将这些细节包括在问题中(我也可以这样做,但我担心会进一步混淆).实际上,作为右值赋值,您的代码更有可能准确地给出您想要的内容…为什么不简单地使用
    existingVector.clear()
    ?它甚至更难输入。@πάνταῥεῖ 请参阅我对其中一个答案的评论。我想这个问题缺少一些关于您真正想要做什么的细节(例如,重置容量)。请将这些细节包括在问题中(我也可以这样做,但我担心会进一步混淆)。实际上,你的代码有更好的机会给你想要的东西,作为右值赋值……清除很简单,但不是完全擦除,因为它会留下可用的内存,对吗?@Jerome:可能是这样,实际上也是这样,但这同样适用于你的方法。请参阅我对另一个答案的评论。
    收缩到适合
    是一个“非绑定”要求从可移植性的角度来看,这使得它与std::random_设备一样脆弱和毫无意义:(
    shorn_to_fit
    是不具有约束力的,因为标准不希望对任意大小进行精确拟合。例如,如果向量为7个字符,则如果内存管理器提供的分配大小是8或16个字节,则允许进行收缩。清除很简单,但不是完全擦除,因为它会保留内存y可用,对吗?@Jerome:可能,实际上也是,但你的方法也是如此。请看我对另一个答案的评论。
    shorn\u to\u fit
    是一个“无约束力”的请求。从可移植性的角度看,这使得它与
    std::random\u device
    一样脆弱和毫无意义:(
    shorn_to_fit
    不具有约束力,因为标准不希望对任意大小进行精确拟合。例如,如果向量为7个字符,则如果内存管理器提供了8或16个字节的分配大小,则允许收缩产生8或16个字节的容量。