Pertanyaan Bagaimana cara membagi string menggunakan istringstream dengan pembatas lainnya daripada spasi?


Trik berikut menggunakan istringstream untuk membagi string dengan spasi putih.

int main() {
    string sentence("Cpp is fun");
    istringstream in(sentence);
    vector<string> vec = vector<string>(istream_iterator<string>(in), istream_iterator<string>());
    return 0;
}

Apakah ada trik serupa untuk membagi string dengan any pembatas? Contohnya, | di "Cpp | is | fun".


32
2017-12-26 11:25


asal


Jawaban:


Secara umum pendekatan aliran awal berjalan lambat / tidak efisien dan membutuhkan setidaknya banyak memori seperti string itu sendiri (Apa yang terjadi ketika kamu memiliki string yang sangat besar?). Itu C ++ String Toolkit Library (StrTk) memiliki solusi berikut untuk masalah Anda:

#include <string>
#include <vector>
#include <deque>
#include "strtk.hpp"
int main()
{
   std::string sentence1( "Cpp is fun" );
   std::vector<std::string> vec;
   strtk::parse(sentence1," ",vec);

   std::string sentence2( "Cpp,is|fun" );
   std::deque<std::string> deq;
   strtk::parse(sentence2,"|,",deq);

   return 0;
}

Lebih banyak contoh dapat ditemukan Sini


20
2017-12-26 17:21



#include <iostream>
#include <string>
#include <sstream>

int main()
{
  std::istringstream iss { "Cpp|is|fun" };

  std::string s;
  while ( std::getline( iss, s, '|' ) )
    std::cout << s << std::endl;

  return 0;
}

Demo


4
2018-06-04 22:36



#include <iostream>
#include <string>
#include <regex>
#include <algorithm>
#include <iterator>

using namespace std;


vector<string> splitter(string in_pattern, string& content){
    vector<string> split_content;

    regex pattern(in_pattern);
    copy( sregex_token_iterator(content.begin(), content.end(), pattern, -1),
    sregex_token_iterator(),back_inserter(split_content));  
    return split_content;
}

int main()
{   

    string sentence = "This|is|the|sentence";
    //vector<string> words = splitter(R"(\s+)", sentence); // seperate by space
    vector<string> words = splitter(R"(\|)", sentence);

    for (string word: words){cout << word << endl;}

}   

// we use regex to find the "|" and split the surrounding elements into an array. We then cout each of those elements in a for loop.

//  This method allows for splitting with regex as an alternative

-1
2018-02-17 02:35