C++11中如何使用字符串分割

83

如何使用C++11最简单地拆分字符串?

我见过这个帖子中使用的方法,但我认为应该有一种更简洁的方式来使用新标准。

编辑:我想要一个vector<string>作为结果,并能够在单个字符上进行分隔。


1
在空格上分割?我认为C++11在这里没有添加任何内容,我认为被接受的答案仍然是最好的方法。 - Mooing Duck
你在分割后想要做什么?输出到cout吗?还是获取一个子字符串的向量? - balki
这不是正则表达式解析的用途吗? - Nicol Bolas
1
我认为得票最高的答案是最好的。 - Mansuro
1
可能是遍历字符串中单词的最优雅方法的重复问题。 - underscore_d
使用c++17,您可以使用string_view,这将使字符串副本变得多余(有附加条件),或者如果您不介意添加库,您可以使用abseil https://abseil.io/tips/10。我会给出这个答案,但问题特别要求c++11。 - Paul Rooney
11个回答

0
一种可能的方法是找到分割字符串的所有出现并将位置存储到列表中。然后计算输入字符串的字符数,当您到达位置列表中存在“搜索命中”的位置时,您就可以通过“分割字符串的长度”向前跳转。这种方法适用于任何长度的分割字符串。以下是我经过测试和工作的解决方案。
#include <iostream>
#include <string>
#include <list>
#include <vector>

using namespace std;

vector<string> Split(string input_string, string search_string)
{
    list<int> search_hit_list;
    vector<string> word_list;
    size_t search_position, search_start = 0;

    // Find start positions of every substring occurence and store positions to a hit list.
    while ( (search_position = input_string.find(search_string, search_start) ) != string::npos) {
        search_hit_list.push_back(search_position);
        search_start = search_position + search_string.size();
    }

    // Iterate through hit list and reconstruct substring start and length positions
    int character_counter = 0;
    int start, length;

    for (auto hit_position : search_hit_list) {

        // Skip over substrings we are splitting with. This also skips over repeating substrings.
        if (character_counter == hit_position) {
            character_counter = character_counter + search_string.size();
            continue;
        }

        start = character_counter;
        character_counter = hit_position;
        length = character_counter - start;
        word_list.push_back(input_string.substr(start, length));
        character_counter = character_counter + search_string.size();
    }

    // If the search string is not found in the input string, then return the whole input_string.
    if (word_list.size() == 0) {
            word_list.push_back(input_string);
            return word_list;
    }
    // The last substring might be still be unprocessed, get it.
    if (character_counter < input_string.size()) {
        word_list.push_back(input_string.substr(character_counter, input_string.size() - character_counter));
    }

    return word_list;
}

int main() {

    vector<string> word_list;
    string search_string = " ";
    // search_string = "the";
    string text = "thetheThis is  some   text     to test  with the    split-thethe   function.";

    word_list = Split(text, search_string);

    for (auto item : word_list) {
        cout << "'" << item << "'" << endl;
    }

    cout << endl;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接