reverse_string.h
#ifndef REVERSE_STRING_H
#define REVERSE_STRING_H
#include <string>
namespace reverse_string
{
std::string reverse_string(std::string_view str);
}
#endif // REVERSE_STRING_H
reverse_string.cpp
#include "reverse_string.h"
namespace reverse_string
{
// (1) the function takes its argument "by value"
std::string reverse_string(std::string_view original)
{
// (2) start with an empty string
std::string result;
// (3) loop as long as the parameter still contains characters
while (!original.empty())
{
// (3) pop the last character off the parameter and append it to the result
char c = original.back();
original.remove_suffix(1);
result.push_back(c);
}
// result now contains a reversed version of the string
return result;
}
} // namespace reverse_string;
The type of the parameter
The function takes a std::string_view
as its argument.
That type was added to C++17, it is an immutable "view" of a string, it is cheap to construct and to copy (see cppreference.com.)
We can use it here because the function does not really modify the underlying string, the remove_suffix(1)
just narrows the view.
Constructing an empty std::string
There are several equivalent ways to construct an empty std::string
, for example:
std::string result;
std::string result{};
std::string result{""};
std::string result = "";
auto result = std::string{};
None of them is significantly better than the others, chosing one is mostly a matter of personal preferences.
Treating the two strings as stacks.
In programming and computer science "stack" is a term for a container that supports some specific operations (see Wikipedia):
- You can push a new item onto the stack.
- You can pop the top-most (i.e. most recently pushed) item off the stack.
- You can peek at the top-most item (without popping it off the stack).
std::string_view
have the member functions back
(see cppreference.com) and remove_suffix
(see cppreference.com).
std::string
has the member function push_back
(see cppreference.com).
They let use use the two strings like stacks.
-
original.back()
returns the last character of theoriginal
. -
original.remove_suffix(1)
conceptually removes the last character from theoriginal
(it narrows the view). -
result.push_back()
appends a character to theresult
.
If we do that repeatedly until the original
is empty, the result
contains the reversed string.
Conclusion
This is a valid approach, it is correct and reasonably efficient. It is mostly presented as an interesting idea and unique way to think about the problem.