如何有效地从 std::string 中删除双引号(如果存在)

新手上路,请多包涵

这个问题有重复的风险,例如 从 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 仅用于说明目的。

原文由 molita 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2.1k
2 个回答

进行检查可能会很快:

 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) 的一个小常数。

原文由 Seth Carnegie 发布,翻译遵循 CC BY-SA 3.0 许可协议

如果您知道引号将始终出现在第一个和最后一个位置,您可以简单地做

if ( s.front() == '"' ) {
    s.erase( 0, 1 ); // erase the first character
    s.erase( s.size() - 1 ); // erase the last character
}

复杂性在字符串的大小上仍然是线性的。您不能在 O(1) 时间内从 std::string 的开头插入或删除。如果用空格替换字符是可以接受的,那么就这样做。

原文由 Potatoswatter 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题