我是 C++ 的新手,我仍然无法理解何时应该使用指针、引用和 std::move。我编写了一个简短的函数来使用定界符拆分字符串。
std::vector<std::string> mylib::split(std::string string, char delimiter) {
std::vector<std::string> result = std::vector<std::string>();
std::string cache = std::string();
cache.reserve(string.size());
for (char c : string) {
if (c == delimiter) {
result.push_back(std::string(cache));
cache.clear();
} else {
cache += c;
}
}
cache.shrink_to_fit();
result.push_back(cache);
return result;
}
我对这个函数有几个问题: 我应该使用
std::vector<std::string> mylib::split(std::string string, char delimiter) {
或
std::vector<std::string> mylib::split(std::string &string, char delimiter) {
应该是
result.push_back(std::string(cache));
或
result.push_back(std::move(std::string(cache)));
我是否必须关心任何已用对象的销毁,或者我可以像这样使用这个函数吗? 此外,如果有任何其他方法可以改进此方法,我很乐意听取您的想法。
最佳答案
最好的是
std::vector<std::string> mylib::split(const std::string &string, char delimiter) {
因为您不会复制超过需要的内容,并且您向调用者保证您不会修改他们的字符串。它使 API 的意图更加清晰。
result.push_back(std::move(std::string(cache)));
IMO(并不是每个人都会同意),你现在不应该担心 std::move'ing 字符串。是的,你可以,因为在任何一种情况下都不会使用缓存(或无论如何都被清除)。只有当性能成为问题时,您才应该开始关心。并且由于您是一个一个地复制 char,我怀疑最高的性能改进是否来自移动语义。
如前所述,删除初始值设定项并使用 token 拷贝:
std::vector<std::string> split(const std::string& string, char delimiter)
{
std::vector<std::string> result;
size_t pos = 0;
for (size_t scan = 0; scan < string.size(); ++scan)
{
if (string[scan] == delimiter)
{
result.push_back(string.substr(pos, scan - pos));
pos = scan + 1;
}
}
result.push_back(string.substr(pos, string.size() - pos));
return result;
}
关于C++ 拆分字符串反馈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57009444/