Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

std::size_t vs size_t vs std::string::size_type

Tags:

  • Where does size_t come from when I don't have anything included?
  • Is it reasonable to always assume size_t == std::size_t?
  • When should I use the size_type in std containers (string::size_type, vector<T>::size_type, etc)?
like image 751
David Avatar asked Dec 14 '11 16:12

David


2 Answers

Where does size_t come from when I don't have anything included in an empty project?

If you don't have anything included, then you can't use size_t. It's defined in <stddef.h> (and perhaps also in <cstddef>, if your version of that header puts the definitions in the global namespace as well as std).

Is it reasonable to always assume size_t == std::size_t?

Yes. All types and functions defined by the C library are included in the std namespace, as long as you include the appropriate C++ header (e.g. <cstddef> rather than <stddef.h>)

When should I use std::_::size_type?

Do you mean the size_type types defined in some standard classes and templates such as vector? You could use those when using those classes if you like. In most cases, you'll know that it's the same as size_t, so you might as well use that and save a bit of typing. If you're writing generic code, where you don't know what the class is, then it's better to use size_type in case it's not compatible with size_t.

For example, you might want to write a container designed to hold more items than can be represented by size_t. You might use some kind of big number type to represent the container's size, which isn't convertible to size_t. In that case, code like size_t s = c.size() would fail to compile - you'd need to use Container::size_type instead.

like image 84
Mike Seymour Avatar answered Nov 02 '22 15:11

Mike Seymour


Where does size_t come from when I don't have anything included in an empty project?

size_t is a base unsigned integer memsize-type defined in the standard library of C/C++ languages. It is defined in "stddef.h" for C and in <cstddef> for C++.

Types defined by the header file "stddef.h" are located in the global namespace while <cstddef> header places the size_t type in the namespace std.

"stddef.h" from C is included into C++ for compatibility, and hence the type can be found in both the global namespace (::size_t) and the std namespace (std::size_t).

like image 36
Alok Save Avatar answered Nov 02 '22 17:11

Alok Save