【问题标题】:Use `vector<A>::size_type ix` to index `vector<B>`使用 `vector<A>::size_type ix` 来索引 `vector<B>`
【发布时间】:2016-03-05 02:30:39
【问题描述】:

这可能是一个微不足道的问题。通常,我需要定义本地std::vectors,如vector&lt;int&gt;vector&lt;double&gt; 等来存储vector&lt;A&gt; 的一些中间值,其中A 是一个自定义类。这些本地vectors 应该与vector&lt;A&gt; 具有相同的大小

问题是,当我写一些for 将值从vector&lt;A&gt; 分配给本地vectors 时,这样写是不是不好(PS:vect_a 的大小在循环。)

vector<A> vect_a;
vector<int> local_vect;
...
for (vector<A>::size_type ix = 0; ix != vect_a.size(); ++ix) {
    local_vect[ix] = vect_a[ix].get_mem_var();
    ...
}

其中get_mem_var() 只返回Aint mem_var。具体来说,我担心的是,local_vect 属于vector&lt;int&gt;,而不是vector&lt;A&gt;,但它仍然使用ix,它属于vector&lt;A&gt;::size_type,而不是vector&lt;int&gt;::size_type

有时我会让它变得更复杂一些,比如

for (struct {vector<A>::size_type ix; vector<int>::size_type iy;}
        gi = {0, 0}; gi.ix != vect_a.size(); ++gi.ix, ++gi.iy) {
    local_vect[gi.iy] = vect_a[gi.ix].get_mem_var();
    ...
}

但感觉是多余的和不必要的。我听说size_type 通常只是size_t,使用vector&lt;A&gt;::size_type ix 索引vector&lt;int&gt; local_vect 可能就可以了。但这在某种程度上是不好的做法吗?一个更普遍的问题是,如果我们知道vector&lt;A&gt; 和@987654353,可以使用vector&lt;A&gt;::size_type ix 来索引vector&lt;A&gt;vector&lt;B&gt;AB 可以是内置的或用户定义的) @ 应该有相同的大小?

【问题讨论】:

  • 你仍然可以检查类似static_assert(std::is_same&lt;vector&lt;A&gt;::size_type, vector&lt;int&gt;::size_type&gt;::value, "type differ");的内容。
  • 如果你真的担心你可以 static_assert 来检查它们是否相同(或者至少A 更大)......实际上我认为你会发现这种类型总是std::size_t

标签: c++ vector size-type


【解决方案1】:

实际上,std::vector&lt;T&gt;::size_type 可能与任何 T 相同,因此您无需担心。

您可以通过使用std::transform 来避免担心这个问题,例如:

vector<A> vect_a;
vector<int> local_vect;

std::transform(std::begin(vect_a), std::begin(vect_b), std::begin(local_vect),
               [] (const A& a) { return a.get_mem_var(); });

【讨论】:

  • 我会使用 std::mem_fun_ref(&amp;A::get_mem_var); 而不是 lambda。
猜你喜欢
  • 2021-01-26
  • 1970-01-01
  • 2011-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-10
  • 2017-12-23
  • 2013-02-17
相关资源
最近更新 更多