Reputation: 145
This question risks being a duplicate e.g. remove double quotes from a string in c++
but none of the asnwers that I saw addresses my question
I have a list of strings, some of which are double quoted and some aren't, Quotes are always at beginning and end
std::vector<std::string> words = boost::assign::list_of("words")( "\"some\"")( "of which")( "\"might\"")("be quoted");
I am looking for the most efficient way to remove the quotes. Here is my attempt
for(std::vector<std::string>::iterator pos = words.begin(); pos != words.end(); ++pos)
{
boost::algorithm::replace_first(*pos, "\"", "");
boost::algorithm::replace_last(*pos, "\"", "");
cout << *pos << endl;
}
Can I do better than this? I have potentially hundreds of thousands of string to process.They may come from a file or from a database. The std::vector in the example is just for illustration purposes.
Upvotes: 12
Views: 19744
Reputation: 8120
The most efficient way for modern C++ is:
if (str.size() > 1) {
if (str.front() == '"' && str.back() == '"') {
if (str.size() == 2) {
str.erase();
} else {
str.erase(str.begin());
str.erase(str.end() - 1);
}
}
}
Rationale:
erase()
function modifies the string instead of reallocating it.front()
on empty strings triggers undefined behavior.erase
calls and optimize the code further (removing the first and last char together is a standard problem).Upvotes: 1
Reputation: 75130
It would probably be fast to do a check:
for (auto i = words.begin(); i != words.end(); ++i)
if (*(i->begin()) == '"')
if (*(i->rbegin()) == '"')
*i = i->substr(1, i->length() - 2);
else
*i = i->substr(1, i->length() - 1);
else if (*(i->rbegin()) == '"')
*i = i->substr(0, i->length() - 1);
It might not be the prettiest thing ever, but it's O(n) with a small constant.
Upvotes: 5
Reputation: 6204
This is how I would approach the situation:
std::vector<std::string>
in the first place. If you are simply receiving a std::vector<std::string>
there isn't too much you can do as removing the first quote will require copying the rest of the string.Upvotes: -3
Reputation: 137800
If you know the quotes will always appear in the first and last positions, you can do simply
if ( s.front() == '"' ) {
s.erase( 0, 1 ); // erase the first character
s.erase( s.size() - 1 ); // erase the last character
}
The complexity is still linear in the size of the string. You cannot insert or remove from the beginning of a std::string
in O(1) time. If it is acceptable to replace the character with a space, then do that.
Upvotes: 26