|
17.5 — std::string assignment and swapping
By Alex on July 18th, 2010 | last modified by Alex on August 6th, 2017 String assignment
The easiest way to assign a value to a string is to use the overloaded operator= function. There is also an assign() member function that duplicates some of this functionality.
string& string::operator= (const string& str)
string& string::assign (const string& str)
string& string::operator= (const char* str)
string& string::assign (const char* str)
string& string::operator= (char c)
- These functions assign values of various types to the string.
- These functions return *this so they can be “chained”.
- Note that there is no assign() function that takes a single char.
Sample code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
|
string sString; // Assign a string value sString = string("One"); cout << sString << endl; const string sTwo("Two"); sString.assign(sTwo); cout << sString << endl; // Assign a C-style string sString = "Three"; cout << sString << endl; sString.assign("Four"); cout << sString << endl; // Assign a char sString = '5'; cout << sString << endl; // Chain assignment string sOther; sString = sOther = "Six"; cout << sString << " " << sOther << endl; |
Output:
One
Two
Three
Four
5
Six Six
|
The assign() member function also comes in a few other flavors:
string& string::assign (const string& str, size_type index, size_type len)
- Assigns a substring of str, starting from index, and of length len
- Throws an out_of_range exception if the index is out of bounds
- Returns *this so it can be “chained”.
Sample code:
|
const string sSource("abcdefg"); string sDest; sDest.assign(sSource, 2, 4); // assign a substring of source from index 2 of length 4 cout << sDest << endl; |
Output:
cdef
|
string& string::assign (const char* chars, size_type len)
- Assigns len characters from the C-style array chars
- Throws an length_error exception if the result exceeds the maximum number of characters
- Returns *this so it can be “chained”.
Sample code:
|
string sDest; sDest.assign("abcdefg", 4); cout << sDest << endl; |
Output:
abcd
This function is potentially dangerous and its use is not recommended.
|
string& string::assign (size_type len, char c)
- Assigns len occurrences of the character c
- Throws a length_error exception if the result exceeds the maximum number of characters
- Returns *this so it can be “chained”.
Sample code:
|
string sDest; sDest.assign(4, 'g'); cout << sDest << endl; |
Output:
gggg
|
Swapping
If you have two strings and want to swap their values, there are two functions both named swap() that you can use.
void string::swap (string &str)
void swap (string &str1, string &str2)
- Both functions swap the value of the two strings. The member function swaps *this and str, the global function swaps str1 and str2.
- These functions are efficient and should be used instead of assignments to perform a string swap.
Sample code:
|
string sStr1("red"); string sStr2("blue"); cout << sStr1 << " " << sStr2 << endl; swap(sStr1, sStr2); cout << sStr1 << " " << sStr2 << endl; sStr1.swap(sStr2); cout << sStr1 << " " << sStr2 << endl; |
Output:
red blue
blue red
red blue
|
|
|
“is to the use the”, probably “is to use the”…
quote from above:
does anybody have some more information what that is about? it seems not to be the case here. double and single quotes for example are copied correctly from a string literal.
Hmm, not sure. I wrote that a long time ago, and I can't find any evidence for it any more. I've removed it for now.
Above section Swapping", you wrote:
"Throws an length_error exception...".
"an" should be "a".
If the string& string::operator= (const string& str) requires a constant string argument, how are you simply able to do
?
After refreshing myself on function parameters, I've deduced that this is possible because a function parameter is it's own new variable inside of a function, simply given the value of whatever argument you pass in. So you could make it constant, sure- it's its own variable, and that const var would simply receive the value of string( "one") ( which it would reference. )
The compiler will convert const literal string "One" into a "string" object via converting constructor std::string(const char*).
In other words, the compiler is smart enough to know how to convert "One" into a std::string because there's a std::string constructor that takes C-style string literals.
Last code, line 2: missing <">
In the line 2 of the sample code of Swapping section :
Close the quotation after the word 'blue' otherwise the code would not run in the way that which is intended for.
Good Day.
Done. Thanks!
Typo ("it's" should be "its"): "This function is potentially dangerous and it’s use is not recommended."
Fixed. Thanks!
Hey Alex,
I just want to ask a simple question. We know that the input stream (cin>>) its terminated after it sees a whitespace. But what if I want to include in my sting type object (lets say string name) a whole sentence? Like in my 'name' variable I store a string of characters "Hello how are you", but if I did this:
string name;
cin>>name; // I wrote 'Hello how are you'
So how will win take action on this when it sees a whitespace after 'Hello', will it terminate and won't store the rest of the string?
Use std::getline instead, as it's designed to read everything up to a newline (including spaces).
Hi Alex,
Thanks a lot for these wonderful tutorials. Can you please add some tutorials on Vector, other Container classes, Shared_ptr, and other advanced C++ topics?
Thanks a lot again.
from last code block u forgot to close "blue with ..."...