进行字符串前缀测试的优雅方法
Elegant way to do a string prefix test
据
我所知,标准库中没有直接执行此操作的工具。所以,我想找到一种简单而优雅的方法。请注意,我不打算自己编写is_prefix()
函数。只需使用标准库中已有的内容即可。假设任务是测试 a
是否是 b
的前缀(两者都是 std::string
类型)。
最简洁的方式似乎是b.find(a) == 0
.但这需要O(a.size() * b.size())
时间。白搭。
另外,我们可以做 b.substr(0, a.size()) == a
.这需要线性时间。但它会创建一个新的字符串对象,这可能涉及堆上的动态内存分配。所以,不好。
我们可以写b.size() >= a.size() && std::equal(b.begin(), b.begin() + a.size(), a.begin())
.就运行时性能而言,这是最佳的,但代码很长。
有什么建议吗?
对于那些想知道我为什么要问这个问题的人,我想找到一个方便的解决方案来用于 TopCoder SRM 和求职面试。
您可以使用
std::mismatch
算法:
bool is_prefix(const std::string& data, const std::string& prefix)
{
auto mismatch = std::mismatch(data.begin(), data.end(),
prefix.begin(), prefix.end()).second;
return mismatch == prefix.end();
}
对于坚持使用旧Visual Studio版本的人:
由于str必须至少与前缀一样长,因此我们可以使用3参数版本,不再需要更新的c ++标准。
std::mismatch(prefix.begin(), prefix.end(), str.begin()).first == prefix.end();
相关文章:
- 有什么好的方法可以让系统调用代理允许在单元测试中进行模拟
- 有没有一种优雅而快速的方法来测试整数中的 1 位是否位于连续区域
- 谷歌测试方法与流
- googletest:测试基类具有纯虚拟方法的派生类时的核心转储
- 在 gtests 中测试C++全局变量的最佳方法
- std::is_invocable 用于测试任意方法是否存在的语法(不仅是运算符())
- C++ 谷歌模拟/单元测试:模拟方法未调用,原始方法是
- 更好的单元测试方法,花费的时间太长
- 多个 if-else 测试的更简单方法
- 生成用于测试的随机结构的通用方法
- cppUnit:针对多个测试方法执行一次的设置函数
- 有什么方法可以从Visual Studio 2017中的Catch C++测试中获取代码覆盖率指标?
- 如何测试基类中的方法是否已使用谷歌模拟调用和执行?
- 模板或链接接缝依赖注入有哪些替代方案来测试非虚拟方法?
- 单位测试私人方法通过使其自由功能
- 使用 CLion 在不同文件中分离 Boost 测试套件的正确方法
- 如何每次使用不同的参数多次测试方法
- 如何实例化多个 set 对象来测试 Set 类的各种构造函数和方法
- 使用Google Test API进行C 测试私人方法的可能方法是什么?
- 测试用户输入数组中的重复项的最有效方法是什么?