【问题标题】:How do I declare a vector of vector::size_type?如何声明 vector::size_type 的向量?
【发布时间】:2016-04-07 17:57:46
【问题描述】:

我想要一个向量,其元素的类型为 vector::size_type

但是,您不能声明:

vector<vector::size_type> aVec;

因为 size_type 是模板本身的一部分,所以你必须使用类型本身,我需要这样的东西:

vector<vector<T>::size_type> aVec;

但是 T 应该是什么?这确实是一个循环问题。 :)

如果 vector 刚刚使用 size_t 作为它的大小类型(但没有针对 size_type 的特殊 typedef,它可能会根据 vector 所持有的类型而有所不同),我可以这样做:

vector<size_t> aVec;

但是,事实并非如此。我怀疑它被允许改变是有正当理由的,但是通过让它成为模板化向量类的一部分而不是在它之外,这使得这变得困难。

想法?

【问题讨论】:

  • 我看不到这个的真正应用。您的矢量类型由其中存储的内容定义。你想存储向量的大小吗?属于哪一种?
  • 如果您正在执行诸如将索引存储到另一个向量中的操作,请执行 othervector::size_type。如果您没有向量的模板类型,那么尝试为它获取size_type 甚至没有意义。使用size_t
  • std::size_t 只是X::size_type 的别名,不是吗?现在寻找标准报价。
  • 你说是递归问题。那么你是说你想构造一个向量只是为了存储该向量自己的大小?如果您不想存储向量类型自己的大小,那么为什么不访问其他向量类型的类型呢?或者你想存储不同类型向量的大小?那你可以试试std::common_type&lt;T1::size_type, T2::size_type&gt;::type。但是 IIRC,size_type 仅由分配器确定。但是,不要相信我的话。
  • @Mark 我不是说使用vector::size_type,我的意思是只使用size_t。期间。

标签: c++ stl c++14


【解决方案1】:

std::vector&lt;&gt;::size_typestd::size_t 类型的静态成员类型,因此您应该安全使用 std::vector&lt;std::size_t&gt; vec

【讨论】:

  • 标准将size_type定义为typedef implementation-defined size_type;。如果不检查实现,我们实际上无法知道它是什么。我们所知道的是它必须是无符号的,并且 size_type 可以表示任何非负值的差异类型
  • @NathanOliver 标准容器将size_type 定义为Allocator::size_type 的typedef,std::allocator 定义为size_t。由于没有提供用户指定的分配器,因此将使用std::allocator
  • @NathanOliver :是的,你可以,因为这里游说的每个示例都使用std::vector&lt;T&gt;::size_type,而不是std::vector&lt;T, A&gt;::size_type,所以它将始终是std::allocator,因此size_type 将始终是std::size_t
  • @NathanOliver :说实话,我不清楚你想向谁证明什么。它确实是“实现定义的”,但我见过的每个实现都使用typedef typename Alloc::size_type size_type;。在实践中,不这样做会很疯狂。
  • 你真的可以,因为你找不到任何没有它的实现。 IMO这个答案很有用,因为它反映了现实,即使它不符合语言律师的学究。 :-]
【解决方案2】:

为什么不使用vector&lt;vector&lt;int&gt;::size_type&gt; myVector;?如果你从不在其他地方使用 vector&lt;int&gt;anywhere 类型,它不会花费任何成本,因为模板实例化在某种程度上是懒惰的。您可以使用除int 以外的任何其他类型。

vector&lt;T&gt;::size_typevector&lt;T'&gt;::size_type 不同的可能性很小。

【讨论】:

  • "vector&lt;T&gt;::size_typevector&lt;T'&gt;::size_type 不同的可能性很小。" 实际上这是不可能的,因为两者都使用std::allocator,而std::allocator 总是使用@987654329 @.
【解决方案3】:

(我在这里重写了一个答案,这次没有对标准提出任何声明。)

您可以最佳猜测类型(可以是std::size_tstd::vector&lt;void*&gt;::size_type)并在事后检查。

std::vector<std::size_t> Avec;
static_assert(std::is_same<decltype(Avec)::size_type, decltype(Avec)::value_type>(), "bad guess");

【讨论】:

  • 我也认为这是一个最好的解决方案。它至少是便携的 =)
  • 是的,我在想 size_t 可能是要走的路:using SizeT = std::vector&lt;size_t&gt;::size_type; std::vector&lt;SizeT&gt; myVec; 但是,我也意识到这在很大程度上也是一个纯粹的理论问题。感谢所有评论的人! :)
猜你喜欢
  • 1970-01-01
  • 2021-01-26
  • 1970-01-01
  • 1970-01-01
  • 2011-01-14
  • 1970-01-01
  • 2015-09-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多