【问题标题】:Dynamically sized non resizable array [duplicate]动态大小的不可调整大小的数组[重复]
【发布时间】:2015-05-06 20:21:12
【问题描述】:

是否存在类似于“动态大小的不可调整大小的数组”的 C++ 类型?这种类型可以被认为是以下两种情况之一:

  • vector<T> 但没有 resizepush_back 等。
  • array<T,N> 但其中 N 是动态的而不是静态的。

我不想要一个仅在数组中元素的类型是不可复制类型时才有效的解决方案。我想要一个通用的解决方案。

【问题讨论】:

  • 为什么需要这个?为什么不能使用向量或数组?
  • 我希望我的类型尽可能准确。我计划使用一些vector,但只设置一次它的大小,然后只更改它的值。如果我可以通过类型系统而不是通过评论来记录这一点,我更喜欢。
  • 为什么数组类只能在类型不可复制的情况下工作?
  • @tenfour:如果有人忘记不应该调整这些函数的大小,则无法阻止使用这些函数。如果您依赖稳定的迭代器和对元素的引用,那可能是灾难性的。
  • @Cyber​​ - 这不是重复的。请注意,在最初的问题中,解决方案建议使用不可复制的元素,我特别说我想要一个通用的元素。

标签: c++ arrays boost vector stl


【解决方案1】:

是的,(几乎)有。 std::unique_ptr<T[]>。主模板针对这种情况进行了部分特化,提供了适当的接口(运算符[],无运算符* 等)

或者,您可以将std::vector 包装在您自己的类中并限制其接口。您甚至可以通过使用非公共继承从 std::vector 派生一个类并仅发布其接口的相关部分来做到这一点:

template <class T, class A = std::allocator<T>>
struct FixedVector : private std::vector<T, A>
{
  using FixedVector::vector::vector;
  using FixedVector::vector::operator=;
  using FixedVector::vector::get_allocator;
  using FixedVector::vector::at;
  using FixedVector::vector::front;
  using FixedVector::vector::back;
  using FixedVector::vector::data;
  using FixedVector::vector::begin;
  using FixedVector::vector::cbegin;
  using FixedVector::vector::end;
  using FixedVector::vector::cend;
  using FixedVector::vector::empty;
  using FixedVector::vector::size;
  using FixedVector::vector::operator[];
};

【讨论】:

  • 如果我错了,请纠正我,但这必须是const,否则有人可以替换指针。正确的? const 允许它真正用作一次性可调整大小的向量,仅此而已。
  • using 的绝妙技巧
  • 似乎使用const std::vector&lt;&gt; 是显而易见的解决方案
  • @VictorEijkhout 我显然错过了导入函数列表中的operator[]。感谢您指出。
  • 在您的代码块中cbegin 后面缺少一个分号;,但不幸的是,编辑必须至少有6 个字符,所以我无法更新它。
猜你喜欢
  • 2020-11-28
  • 2012-10-02
  • 2018-02-16
  • 2020-11-26
  • 1970-01-01
  • 2021-05-30
  • 1970-01-01
  • 1970-01-01
  • 2022-11-19
相关资源
最近更新 更多