调整大小时只允许 C++ 向量增长
Only allow a C++ vector to grow when resizing
是否有 std::vector
的 resize()
的替代方案,它只允许增加向量的大小
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;
};
是否有 std::vector
的 resize()
的替代方案,它只允许增加向量的大小
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;
};