如何实现自己的函数到std :: vector?

Roo*_*kie 1 c++ std

我想添加一个函数,它将.size()值作为整数返回,而不是无符号整数.

编辑:由于评论,我解释更详细:

我有代码:

int something = 3;
if(arr.size() > something) 
Run Code Online (Sandbox Code Playgroud)

这将产生编译器警告,我不喜欢添加(int)到我拥有它的每个地方.所以,我认为使用sizei()函数会很好的解决方案:

int something = 3;
if(arr.sizei() > something) 
Run Code Online (Sandbox Code Playgroud)

哪个不会产生警告.

所以,我不想创建一个单独的函数,而是std :: vector本身的一个函数.

编辑:似乎这样做的唯一方法是创建另一个函数,例如:

template <typename T>
inline int sizei(const T &arr){
    return (int)arr.size();
}
Run Code Online (Sandbox Code Playgroud)

从积极的方面来看:这似乎根本不会增加我的可执行文件大小.

Naw*_*waz 6

首先,你为什么要这样?我没有看到任何理由或优势:

无论如何,你可以这样做:

template<typename T>
int size(const std::vector<T> &v) { return (int) v.size(); }

//use
std::vector<int> ints;
//...
int count = size(ints);
Run Code Online (Sandbox Code Playgroud)

我仍然没有看到这样做的任何意义.你可以简单地写:

int count = (int) ints.size(); 
Run Code Online (Sandbox Code Playgroud)

但我仍然会说它不比以下更好:

size_t count = ints.size(); //don't prefer anything over this. Always use size_t
Run Code Online (Sandbox Code Playgroud)

建议:避免使用int尺寸.喜欢size_t.


至于你的问题编辑.你为什么不用size_t作:

size_t something = 3;
if(arr.size() > something) 
Run Code Online (Sandbox Code Playgroud)

没有警告.在我看来,如果你选择的数据在整个程序中始终打字,你不会看到他的情况来当你比较intsize_t被定义为无符号整型.

或者,如果有一些遗留代码可以使用,哪些int用于大小,那么我认为最好在需要时使用显式强制转换,而不是在框架本身中添加一个函数,这隐藏了潜在的问题:

int something = /*some legacy code API call or something */;
if(arr.size() > (size_t) something) 

//or even better;
size_t something = (size_t) /*some legacy code API call or something */;
if(arr.size() > something) 
Run Code Online (Sandbox Code Playgroud)

  • @littleadv我认为这正是他所要求的:"一个将.size()值作为整数返回的函数" (2认同)
  • `你为什么要这样做?`这不是一个不寻常的要求:例如:你可能有一个函数在某种结构化存储中返回一个特定命名的'对象'的大小.如果缺少对象,则返回-1,因为我们需要区分缺失和空数据.此外,这些文件中缺少的数据不足以"证明抛出".所以,你经常得到像`if(object.dataSize("Foo")== sizeof(MyStruct)){readIt(); }`,这会导致有关比较signed和unsigned的编译器警告. (2认同)
  • 使用`size_t`作为`vector`的+1不能具有负大小(至少不在此Universe中) (2认同)