C++ 拆分字符串反馈

标签 c++ c++11

我是 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/

相关文章:

c++ - 使用模板函数将转换应用于具有索引的 vector

c++ - 为什么构造不完整类型的 std::unique_ptr 编译?

c++ - 我应该如何为我的类编写构造函数

c++ - 相同定义变量的节类型冲突

c++ - 为什么可变参数模板的模板特化与非可变模板的特化不同?

c++11 - react 性扩展中的cpp编译错误

用于运行 C 程序的 Python 脚本

c++ - EASTLand SGI哈希表实现

c++ - 我是否必须使用 std::shared_ptr 删除对对象的所有引用

c++ - 写入文件时出现堆损坏