Кажется, что способ, которым большинство людей находят размер string
они просто используют my_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.
MSVS 2015 имеет size
функция, определенная в 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 и не будет работать на НКУ или же лязг
Это было подробно описано в блоге Особенности C ++ 11/14/17 в VS 2015 RTM
size
на самом деле функциональность C ++ 17. Реальная выгода сродни пользе begin
а также end
из C ++ 11.
Обратите внимание, что первое определение 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
если у вас есть поддержка C ++ 17 или лучше, потому что это улучшит возможность повторного использования в контейнерах и массивах.
В соответствии с 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.