11

似乎大多数人找到 a 大小的方式string是他们只使用 themy_string.size()并且它工作正常。好吧,我最近在我做过的课程上做了一个作业......

if (size(my_string) < 5)
    store[counter].setWeight(stoi(my_string));

代替....

if (my_string.size() < 5)
    store[counter].setWeight(stoi(my_string));

但令我惊讶的是,我认为正在运行旧编译器的讲师无法运行那行代码。在我的编译器上它可以双向工作,我不太清楚为什么。

一个完整的程序(两者都输出 4):

#include <string>
#include <iostream>
using namespace std;

int main()
{
    string myvar = "1000";
    cout << "Using size(myvar) = " << size(myvar) << endl;
    cout << "Using myvar.size() = " << myvar.size() << endl;
}

如果有人能解释为什么我的问题解决方案适用于我的机器而不是我的教授?另外,我目前正在运行 VS2015。

4

3 回答 3

13

size实际上是 C++17 功能。begin真正的好处类似于endC++11 的好处。

请注意,第一个定义size只是返回容器的 size 方法。

因此,如果我有这样的模板化函数:

template <typename T>
auto foo(const T& bar) { return bar.size(); }

这只能与容器一起使用,但如果我将其更改为:

template <typename T>
auto foo(const T& bar) { return size(bar); }

它也可以与 C 风格的数组一起使用。我在这里添加了一个实时示例:http: //melpon.org/wandbox/permlink/Rlpi5wueA14JOW2P

总之,size由于对通用性和容器无关代码的改进,您应该始终使用和其他基于范围的函数(有关更多信息,请参见此处)。

于 2015-10-30T18:40:05.820 回答
12

MSVS 2015size在 xutility 中定义了一个函数

template<class _Container>
auto inline size(const _Container& _Cont)
    -> decltype(_Cont.size())
{   // get size() for container
return (_Cont.size());
}

这是您调用时正在使用的功能

cout << "Using size(myvar) = " << size(myvar) << endl;

这不是标准的 C++11/14 函数,不会在gccclang上运行

这在博客文章C++11/14/17 Features In VS 2015 RTM中有详细说明

于 2015-10-30T18:35:09.290 回答
3

根据http://blogs.msdn.com/b/vcblog/archive/2015/06/19/c-11-14-17-features-in-vs-2015-rtm.aspx VS2015开始支持非会员size n4280提案。

他们在没有任何定义或编译器标志的情况下开箱即用地启用它有点奇怪。但似乎是这样。目前它可能被认为是非标准的,尽管它已经被投票支持 c++17。

于 2015-10-30T18:37:12.330 回答