Using the string class as a container

C++ strings are based on the basic_string template class. This class is a container, so it uses iterator access and methods to obtain information, and has template parameters that contain information about the character type it holds. There are different typedef for specific character types:

    typedef basic_string<char,
char_traits<char>, allocator<char> > string;
typedef basic_string<wchar_t,
char_traits<wchar_t>, allocator<wchar_t> > wstring;
typedef basic_string<char16_t,
char_traits<char16_t>, allocator<char16_t> > u16string;
typedef basic_string<char32_t,
char_traits<char32_t>, allocator<char32_t> > u32string;

The string class is based on char, wstring is based on wchar_t wide characters, and the 16string and u32string classes are based upon 16-bit and 32-bit characters, respectively. For the rest of the chapter, we will concentrate on just the string class, but it equally applies to the other classes.

Comparing, copying, and accessing characters in a string will require a different code for the different-sized characters, while the traits template parameter provides the implementations. For string, this is the char_traits class. When this class, for example, copies characters, it will delegate this action to the char_traits class and its copy method. The traits classes are also used by stream classes, so they also define an end of file value that is appropriate to the file stream.

A string is essentially an array of zero or more characters that allocates memory when it is needed and deallocates it when a string object is destroyed. In some respects, it is very similar to a vector<char> object. As a container, the string class gives iterator access through the begin and end methods:

    string s = "hellon"; 
copy(s.begin(), s.end(), ostream_iterator<char>(cout));

Here, the begin and end methods are called to get iterators from the items in the string, which are passed to the copy function from <algorithm> to copy each character to the console via the ostream_iterator temporary object. In this respect, the string object is similar to a vector, so we use the previously defined s object:

vector<char> v(s.begin(), s.end()); 
copy(v.begin(), v.end(), ostream_iterator<char>(cout));

This fills the vector object using the range of characters provided using the begin and end methods on the string object and then prints those characters to the console using the copy function in exactly the same way as we used previously.

..................Content has been hidden....................

You can't read the all page of ebook, please click here login for view all page.
Reset