std :: vector :: size返回int类型或unsigned int

时间:2018-01-19 06:46:28

标签: c++ vector c++14

在我使用std::vector编写的大多数程序中,我的大部分痛苦都在转换

int offset=(int)v.size();
unsigned int offset=(unsigned int)v.size();

令人遗憾的是,这些问题反映在许多其他问题中,例如this

有没有办法重新布线std::vector并强制它给出intunsigned int之类的尺码?

int offset=v.size_i();

类型转换会使代码变得更加混乱。虽然,有些程序员喜欢它们,并且觉得每次演员都没有问题。

c++14解决方案更受欢迎,但也欢迎使用c++17解决方案。

如果某人建议更改变量的类型,则很快或迟到另一种类型转换必须发生。所以它没有解决问题。

请考虑这些难看的短语

function((int)myvar1.vec[32].size(),(int)myvar2.vec[32].size());

其中function仅接受int次。我无法控制它的定义。

3 个答案:

答案 0 :(得分:4)

您可以继承std::vector并重新实现size()函数以返回签名值:

template<typename T, typename Alloc = std::allocator<T> >
class my_vector : public std::vector<T, Alloc>
{
    using base_t = std::vector<T,Alloc>;
public:
    using base_t::vector;
    using base_t::operator =;

    int size() const noexcept { return base_t::size(); }
};

答案 1 :(得分:2)

BaseClass将成为std::vector<>.size()。这是班级的连线方式,它甚至包括unsigned类型,即typedef。养成使用std::vector<>::size_type抵消的习惯会好得多。

答案 2 :(得分:1)

在c ++ 20中,您可以使用std::ssize返回一个带符号的整数。

用作:

std::ssize(my_std_vector)

或:

my_std_vector.ssize()

将其引入标准库的建议为P1227R1