调整大小时只允许 C++ 向量增长

Only allow a C++ vector to grow when resizing

是否有 std::vectorresize() 的替代方案,它只允许增加向量的大小

std::vector v;
v.resize(10);
v.resize(5);

--> v.size() == 5,但我喜欢它的长度保持在 10 而且我喜欢它的数据不被(可能)删除。

我可以用

std::vector v;
v.resize(std::max(v.size(),10));
v.resize(std::max(v.size(),5));

这有点难看。有没有更优雅的方式?

这似乎是一个奇怪的要求。知道你为什么想要这个无限扩展的向量会很有趣。一种解决方案(如 here 所建议)是私下继承 std::vector 并实现您自己的调整大小,例如:

template <class T> // Can also forward the allocator if you want
class InfiniteResizeVector: private std::vector<T> 
// The private is very important, std::vector has no virtual destructor, so you 
// cannot allow someone to reference it polymorphically. 
{
public:
    using vector::push_back;
    using vector::operator[];
    ... // For all the functions you need
    void resize(size_t new_size) {
       vector::resize(std::max(size(),new_size));
    }
};

用法将如您要求的那样 v.resize(5);确保您阅读了上面 link 中的一些其他答案。这是一件非常不寻常的事情,除非这是你会一直使用的东西,否则肯定不值得制作自己的独立类型。

Fantastic Mr Fox提出通过继承和重写来解决这个问题,但是通过组合组合是可以解决这个问题的,但是可能会稍微麻烦一点,这里是我的例如。

template<typename T>
class OnlyGrowVector {
public:
    using size_type = typename std::vector<T>::size_type;

    void push_back(T&& t)
    {
        m_vector.push_back(std::forward<T>(t));
    }

    T& operator[](size_type idx)
    {
        return m_vector[idx];
    }
... // for what you need
    void resize(size_type size)
    {
        m_vector.resize(std::max(m_vector.size(), size));
    }

private:
    std::vector<T> m_vector;
};