替换 C++ 字符串中的标点符号
Posted
技术标签:
【中文标题】替换 C++ 字符串中的标点符号【英文标题】:Replace punctuation in C++ string 【发布时间】:2019-06-17 22:56:13 【问题描述】:我试图理解为什么 binary_search() 找不到某些标点符号,而 find() 可以:
array<char, 25> punctuation_chars'\'', '\"', ',', '.', ';', ':', '+', '*', '-', '_', '?', '!', '=', '|', '^', '/', '\\', '(', ')', '[', ']', '', '', '<', '>';
bool is_punctuation(char c)
auto ret = find(cbegin(punctuation_chars), cend(punctuation_chars), c) != cend(punctuation_chars);
// auto ret = binary_search(cbegin(punctuation_chars), cend(punctuation_chars), c);
if (c == ',')
cout << c << " is" << (ret ? "" : " not") << " punctuation" << endl;
return ret;
注释行不起作用(例如,对于 c == ',' 返回 false),而 find 返回 cend(punctuation_chars)...
【问题讨论】:
您确定punctuation_chars
已排序吗?可以拨打std::is_sorted(punctuation_chars.begin(), punctuation_chars.end())
查看(不是:wandbox.org/permlink/tpTR98nXBqmSncCY)
您是否阅读了binary_search
的文档?你知道什么是二分搜索算法以及它是如何工作的吗?你查到了吗?
你是对的,只是在没有 C++ 的几年之后,我忘记了简单的事情有多难。使用 javascript 工作我已经习惯了很棒的 lodash 库,当我发现二进制搜索时,我只是想“这是一种接受容器、搜索值并返回 bool 的方法”,并没有问自己容器是否必须被排序。我的错。
【参考方案1】:
punctuation_chars
未排序,因此std::binary_search
不起作用。您需要拨打std::sort
:
std::sort(std::begin(punctuation_chars), std::end(punctuation_chars));
【讨论】:
以上是关于替换 C++ 字符串中的标点符号的主要内容,如果未能解决你的问题,请参考以下文章
如何在没有正则表达式的情况下在 C++ 中实现有效的全字字符串替换?