std :: vector :: assign / std :: vector :: operator =(const&)是否保证重用`this`中的缓冲区?

时间:2018-08-17 09:30:45

标签: c++ c++14 language-lawyer c++17

如果我将一个向量分配或复制到另一个(其容量与前者相同或更大),可以假定后者的缓冲区将被重用吗?

以下示例说明了我可以,但是,标准可以保证吗? 在这方面,std::vector::assignstd::vector::operator=的行为是否有区别?

#include <vector>
#include <iostream>
#include <cassert>

int main()
{
    std::vector a {1, 2, 3, 4, 5};
    std::vector b {1, 2, 3, 4};
    std::vector c {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

    std::cout << "1 ==== " << a.capacity() << " " << a.data() << std::endl;

    const auto* pa = a.data();   
    a = b;
    assert(pa == a.data());
    std::cout << "2 ==== " << a.capacity() << " " << a.data() << std::endl;

    a = c;
    assert(pa != a.data());
    std::cout << "3 ==== " << a.capacity() << " " << a.data() << std::endl;
}

Live example

更新This answer提到了

void assign(size_type n, const T& t);

等同于

erase(begin(), end());
insert(begin(), n, t);

该标准是否真的以此方式制定,并且是否适用于std::vector::assign的所有重载?

1 个答案:

答案 0 :(得分:4)

简短答案

否。

答案不是那么简短

该标准未在vector上手动定义这些操作。它仅将它们定义为容器的要求。 [vector]

  

向量满足序列容器的容器和可逆容器(在[container.requirements]中的两个表中给出)的所有要求,包括大多数可选的序列容器要求([sequence.reqmts] ),可识别分配器的容器(表67),以及对于非bool的元素类型,可使用连续容器。没有提供push_­front,pop_­front和emplace_­front成员函数。这里仅提供对这些表之一中未描述的矢量操作的描述,或其中存在附加语义信息的操作的描述。

仅提及Container requirementsSequence container requirements这两个位置。没有任何证据支持您的假设。