std::vector::size 返回一个 int 类型或 unsigned int。

5
在我编写使用std::vector的大部分程序中,最令我感到困扰的是转换。
int offset=(int)v.size();
unsigned int offset=(unsigned int)v.size();

很遗憾,这样的问题反映在许多其他问题中,例如这个

是否有任何方法可以重新调整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 类型。而且我无法控制它的定义。


1
使用带有“auto”的编译器类型推导?像这样:auto offset = v.size() - Some programmer dude
“offset” 始终是非负值吗?那么可能使用 size_t 作为类型。顺便问一下,您是否尝试过不进行强制转换构建?我已经尝试了很多额外的警告,并且没有关于像 int offset = v.size(); 这样的普通赋值的编译器警告。除非您有超过 20 亿个元素的容器,否则不用担心。如果确实存在这种情况,请改用 long long - Some programmer dude
2
myvar1.vec[32].size() 看起来已经很混乱了,这个可以封装成一个函数,让你得到想要的结果。 - kmdreko
如果一个函数需要一个int类型的参数,通常你可以直接传入unsigned或size_t类型的参数,函数会自动转换。不需要手动进行类型转换。 - super
@ar2015 我说的是整个方法链,而不仅仅是转换。 - kmdreko
显示剩余4条评论
3个回答

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(); }
};

noexcept 是否重要? - ar2015
应该提议为 c++20 - ar2015
1
@ar2015,如果你问我,我认为std::vector::size应该返回无符号类型,因为大小不能为负数。noexcept在这里并不是必要的,主要是为了API的一致性。但在某些可能的情况下可能会有用。 - Andrei R.
5
请记住,std::vector 没有虚析构函数。它不是设计用于(公共)继承。 - Some programmer dude
2
@ar2015 请考虑提交提案 - kmdreko
显示剩余2条评论

2

std::vector<>.size() 的返回值是 unsigned 类型。这是该类的设计方式,甚至包括一个名为 std::vector<>::size_type 的类型定义。使用 unsigned 偏移量会更好。


1
难道不是更好,如果类型转换由库而不是用户每次执行? - ar2015
1
@ar2015 如果库能明确返回类型就更好了,向量的大小永远不会是负数,因此无符号类型是更好的选择。 - kmdreko
1
在大多数应用程序中,您不需要变量很大。此外,在许多计算中也使用了大小,其中最终结果可能为负,并且您需要类型转换才能将其与“int”变量相加/相减。假设(-Wconversion)已打开。 - ar2015
@ar2015 如果只是在大多数应用程序中不需要它们变大,那么在需要的应用程序中呢? - Deduplicator

1
在C++20中,您可以使用std::ssize,它返回一个有符号整数。
使用方法如下:
std::ssize(my_std_vector)

或者:

my_std_vector.ssize()

该提案将其引入标准库,详见P1227R1


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接