获得一个size_type,保证可以通过不同类型的向量进行索引

时间:2012-12-05 19:13:01

标签: c++

假设我有两种类型,Class1Class2。然后我创建了两个向量:

vector<Class1> vec1;
vector<Class2> vec2;
//create vec1 and vec2, such that both have the same number of elements
for (vector<Class1>::size_type i=0; i!=vec1.size(); ++i) {
  c1 = vec1[i];
  c2 = vec2[i]; //BAD?
  //do something
}

你可能会得到这张照片。在这种情况下依赖size_type vector<Class2>vector<Class1>的{​​{1}}相同是不是很糟糕?

在这些情况下,如果你有两个相同大小的向量包含不同类型的对象,但它们足够相关以保证通过它们进行循环,那么如何解决这个问题呢?

我知道我不太可能遇到足够高的整数来遇到问题,但我仍然希望编写好的,健壮的C ++代码。也许我应该看看size_type两个并尽量减少它们?这是要走的路吗?对我来说听起来很奇怪。

3 个答案:

答案 0 :(得分:2)

我不确定这是否由标准保证,但无论您选择哪种模板参数,我都希望所有vector::size_type类型都相同。

答案 1 :(得分:2)

std::allocatorsize_type定义为size_t,因此您可以将size_type假设为size_t iif 您可以保证没有为其size_type定义不同类型的自定义分配器。

但是,您可能会冒一些人稍后回来并添加可能与此假设不兼容的自定义分配器的风险。

答案 2 :(得分:1)

我认为,至少在理论上,你想要的是:

std::common_type<std::vector<classA>::size_type, 
                 std::vector<classB>::size_type>::type i;

for (i=0; i!=vec1.size(); i++)
    // ...

我怀疑你会在大多数代码中定期看到它(也很可能是圣诞派对的祝酒词。)