这个问题有可能重复,例如remove double quotes from a string in c++
但是我所看到的任何一个因素都没有解决我的问题
我有一个字符串列表,其中一些是双引号,一些不是,引号总是在开头和结尾
std::vector<std::string> words = boost::assign::list_of("words")( "\"some\"")( "of which")( "\"might\"")("be quoted");
我正在寻找删除引号的最有效方法。这是我的尝试
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;
}
我能做得比这更好吗?我可能有数十万个字符串要处理。它们可能来自文件或数据库。示例中的std :: vector仅用于说明目的。
答案 0 :(得分:20)
如果您知道引号将始终显示在第一个和最后一个位置,则可以执行
if ( s.front() == '"' ) {
s.erase( 0, 1 ); // erase the first character
s.erase( s.size() - 1 ); // erase the last character
}
字符串大小的复杂性仍然是线性的。您无法在O(1)时间内从std::string
的开头插入或删除。如果用空格替换字符是可以接受的,那么就这样做。
答案 1 :(得分:5)
检查可能会很快:
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);
它可能不是最漂亮的东西,但它是一个小常数的O(n)。
答案 2 :(得分:-2)
这就是我接近这种情况的方式:
std::vector<std::string>
的位置检查和取消引用字符串。如果您只是收到一个std::vector<std::string>
,那么您可以做的太多了,因为删除第一个引号将需要复制其余的字符串。