Skip to content

add replace_all documentation #3478

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Feb 25, 2019
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion src/util/string_utils.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -162,17 +162,21 @@ std::string escape(const std::string &s)

/// Replace all occurrences of a string inside a string
/// \param [out] str: string to search
/// \param from: string to replace
/// \param from: string to replace; must be non-empty
/// \param to: string to replace with
/// Copyright notice:
/// Attributed to Gauthier Boaglio
/// Source: https://stackoverflow.com/a/24315631/7501486
/// Used under MIT license
/// Note that this is quadratic in str.size() if from.size() != to.size().
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

... , because each replacement entails a copy of the contents of the string.

Or maybe something else?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No, that would not change the complexity in str.size() -- unfortunately, std::string::replace does not provide the guarantee that replacing equal-length strings is not independent of the length of the containing string.

/// There is no guarantee that it is linear in str.size() if
/// from.size() == to.size().
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why not?

void replace_all(
std::string &str,
const std::string &from,
const std::string &to)
{
PRECONDITION(!from.empty());
size_t start_pos = 0;
while((start_pos = str.find(from, start_pos)) != std::string::npos)
{
Expand Down