How come this code
std::map <std::string , int> m;
m["a"]=1;
compiles with (I'm using MSVC 2010)
#include <string>
but not with
#include <string.h>
?
<string.h> contains old functions like strcpy, strlen for C style null-terminated strings. <string> primarily contains the std::string, std::wstring and other classes.string.h is deprecated within C++. If you need the functionality contained within, you should use the header cstring. This more or less completely bypasses the issue of "What's the difference between these two" because it's very obvious that one is from the C library.string.h is a C header not a C++ header, period!
<string.h> is cstring - http://www.cplusplus.com/reference/clibrary/cstring/
<string> is the c++ string class - http://www.cplusplus.com/reference/string/
Edit per Nicol Bolas comment below and a bit of googling:
<cstring> will usually import the same things as <string.h> but into the std namespace.
<string.h> will usually import everything into the global namespace.
It appears to depend on the library implementation you're using though according to my googling.
Personally I only ever use <cstring> if I need C style string helpers.
<cstring> is not a synonym for <string.h>. cstring puts stuff in the std namespace (it may also leave them outside of the std namespace), while <string.h> does not..h headers is deprecated in C++.string.h is C's header file while string is C++'s header file.
<string.h> can be considered C++ header file also. :)<string.h> contains C-library string functions. strlen, strcmp, etc.
<string> contains the definition for std::basic_string, which has the typedefs std::string and std::wstring. That's the difference.
They really have no relationship at all, outside of the fact that they both deal with strings.
In C, to use the old C-style string features (including strlen(char*)), we write this:
// C
#include <string.h>
And this is the only way in C. Including this header will define and declare some actual functions (like strlen, strcmp, ...) in the global scope.
And such way of inclusion continues in C++, as the C++ compilers are supposed to be compatible with the most (99%) of C codes. The following identical code includes the old C-style string features (including strlen(char*)):
// C++
#include <string.h>
In C++ to avoid confusion, as the language team renamed the old headers to put away as legacy, we are recommended to write this, rather than 2.:
// C++
#include <cstring.h>
Or, as C++ prefers to omit the ".h" at the end, we write this,
// C++
#include <cstring>
Summary: 1., 2., 3., and 4. are the same thing indicating the old C style string features (including strlen(char*)).
On the other hand, C++ has a new objective container class named std::string, and to include the new C++ style string class , we write:
// C++
#include <string>
Summary: 5. is the only way to bring the new C++ features of string class named std::string.
Plot twister: <string> in itself imports <cstring> (in most compilers). Therefore, for using the old C-style string features, all five examples I've presented will work without error. For using the new C++ string class, again, <string> is the only way.
#include <string.h> is (or may be) equivalent to #include <cstring>. As pointed out in other answers.<string> often includes string.h but, IIRC, it's not required by the Standard to do so. But I could be wrong.