6

在播放并尝试计算矢量的总大小时,我尝试了类似

vector<double> vd;
auto area = vd.size()* sizeof (vd::value_type); 
//Ive seen Stepanov use area as name for this kind of size, idk if he adds the sizeof vd also to area :)

不幸的是,这不起作用......我需要使用vector<double>::value_type,但这会降低代码的可读性。它可以工作吗?我不喜欢sizeof vd.front(),因为为此写它看起来很丑front()
编辑: decltype 变体也适合我所说的丑陋类别......

4

3 回答 3

9

认为 decltype可以使用:

auto area = vd.size() * sizeof(decltype(vd)::value_type);

当您使用时,auto我假设允许使用 C++11。

通过 g++ v4.7.2 和 clang v3.3 确认。

于 2012-12-18T15:52:03.380 回答
4

一个简单的辅助函数怎么样?

template <typename Container>
size_t value_size(const Container &)
{
    return sizeof(typename Container::value_type);
}

[...]

vector<double> vd;
auto area = vd.size() * value_size(vd);

您甚至可以重载该函数,以便它与其他容器(例如数组)一起使用(当然,您也需要包装size)。

理想情况下,整个计算可以包装到一个通用函数中:

template <typename Container>
size_t area(const Container &c)
{
    return c.size() * sizeof(typename Container::value_type);
}

//possible overload for arrays (not sure it's the best implementation)
template <typename T, size_t N>
size_t area(const T (&arr)[N])
{
    return sizeof(arr);
}

[...]

std::vector<double> vd;
auto vd_area = area(vd);
double arr[] = { 1., 2. };
auto arr_area = area(arr);
于 2012-12-18T15:58:53.657 回答
1

在 C++11 中,您可以使用decltype(vd[0])

auto area = vd.size()* sizeof (decltype(vd[0])); 

但在特定情况下,你可以这样写:

auto area = vd.size()* sizeof (vd[0]); 

由于不会计算内部sizeof(以及)内部的表达式,因此即使为空,两者都将起作用。decltypevd

于 2012-12-18T15:52:47.233 回答