假设我有一个C ++字符串/dev/class/xyz1/device/vendor/config
。作为我工作的一部分,我需要从上面的字符串中删除子字符串"device"
和"config"
。
我知道我可以通过两次使用"erase"
来完成它。但是,我想知道这是否可以通过一次通话实现。任何字符串类库调用或boost调用来实现这个?
答案 0 :(得分:2)
除正则表达式外,我不知道任何其他方法。
然而,想想你为什么要这样做。仅仅因为它是一个单一的电话就不会使它成为一个很好的电话。更快,因为代码仍然需要以某种方式执行。
另一方面,为每个单词命令会增加代码可读性,这应该是高优先级。
如果您经常需要这些并且想要保存线条,那么您可以自己轻松编写这样的函数,并将其放入自定义实用程序函数的库中。该函数可以将输入字符串和std::vector
用于字符串或任何其他形式的字符串集合从先前删除。
答案 1 :(得分:0)
并不完全清楚算法的具体程度。但是,对于给定的情况,以下将具有最小的复制并且进行突变"原子地" (如:删除子字符串或不删除子字符串):
namespace ba = boost::algorithm;
void mutate(std::string& the_string) {
if (ba::ends_with(the_string, "/config")) {
auto pos = the_string.find("/device/");
if (std::string::npos != pos) {
the_string.resize(the_string.size() - 7); // cut `/config`
the_string.erase(pos, 7); // cut `/device`
}
}
}
#include <boost/algorithm/string.hpp>
namespace ba = boost::algorithm;
void mutate(std::string& the_string) {
if (ba::ends_with(the_string, "/config")) {
auto pos = the_string.find("/device/");
if (std::string::npos != pos) {
the_string.resize(the_string.size() - 7); // cut `/config`
the_string.erase(pos, 7); // cut `/device`
}
}
}
#include <iostream>
int main() {
std::string s = "/dev/class/xyz1/device/vendor/config";
std::cout << "before: " << s << "\n";
mutate(s);
std::cout << "mutated: " << s << "\n";
}
打印
before: /dev/class/xyz1/device/vendor/config
mutated: /dev/class/xyz1/vendor