使用`vector<A>::size_type ix`来索引`vector<B>`
Use `vector<A>::size_type ix` to index `vector<B>`
这可能是一个微不足道的问题。通常,我需要定义本地 std::vector
s,如 vector<int>
、vector<double>
等来存储 vector<A>
的一些中间值,其中 A
是自定义的 class。这些本地 vector
应该具有 与 vector<A>
相同的大小 。
问题是,当我写一些 for
来将 vector<A>
中的值分配给本地 vector
时,这样写是不是不好的做法 (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()
只是 returns A
的 int mem_var
。具体来说,我担心的是,local_vect
是vector<int>
,而不是vector<A>
,但它仍然使用ix
,这是vector<A>::size_type
而不是vector<int>::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<A>::size_type ix
索引 vector<int> local_vect
可能就可以了。但在某种程度上这是不好的做法吗?一个更普遍的问题是,使用 vector<A>::size_type ix
索引 vector<A>
和 vector<B>
是否可以(A
和 B
可以是内置的或用户定义的) 如果我们知道 vector<A>
和 vector<B>
应该具有相同的大小?
实际上,std::vector<T>::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::vector
s,如 vector<int>
、vector<double>
等来存储 vector<A>
的一些中间值,其中 A
是自定义的 class。这些本地 vector
应该具有 与 vector<A>
相同的大小 。
问题是,当我写一些 for
来将 vector<A>
中的值分配给本地 vector
时,这样写是不是不好的做法 (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()
只是 returns A
的 int mem_var
。具体来说,我担心的是,local_vect
是vector<int>
,而不是vector<A>
,但它仍然使用ix
,这是vector<A>::size_type
而不是vector<int>::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<A>::size_type ix
索引 vector<int> local_vect
可能就可以了。但在某种程度上这是不好的做法吗?一个更普遍的问题是,使用 vector<A>::size_type ix
索引 vector<A>
和 vector<B>
是否可以(A
和 B
可以是内置的或用户定义的) 如果我们知道 vector<A>
和 vector<B>
应该具有相同的大小?
实际上,std::vector<T>::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(); });