2012-10-19 33 views
14

thể trùng lặp:
Splitting a string in C++Có tương đương trong C++ của hàm explode() của PHP không?

Trong PHP, các explode() chức năng sẽ mất một chuỗi và chop nó lên thành một mảng tách từng phần tử bằng một dấu phân cách quy định.

Có một chức năng tương đương trong C++?

+1

Không, nhưng thật dễ dàng để viết triển khai của riêng bạn. –

+1

'đẩy mạnh :: split' từ [tăng/thuật toán/string.hpp] (www.boost.org/doc/html/string_algo.html) – Praetorian

+0

@KerrekSB Tôi nghĩ bạn nên chắc rằng một câu trả lời trước khi điều này được đóng –

Trả lời

28

Dưới đây là một ví dụ đơn giản thực hiện:

#include <string> 
#include <vector> 
#include <sstream> 
#include <utility> 

std::vector<std::string> explode(std::string const & s, char delim) 
{ 
    std::vector<std::string> result; 
    std::istringstream iss(s); 

    for (std::string token; std::getline(iss, token, delim);) 
    { 
     result.push_back(std::move(token)); 
    } 

    return result; 
} 

Cách sử dụng:

auto v = explode("hello world foo bar", ' '); 

Lưu ý: @ ý tưởng của văn bản cho một iterator đầu ra Jerry là thành ngữ hơn cho C++. Trong thực tế, bạn có thể cung cấp cả hai; một mẫu đầu ra-trình lặp và một trình bao bọc tạo ra một vec-tơ, cho sự linh hoạt tối đa.

Lưu ý 2: Nếu bạn muốn bỏ qua thẻ trống, thêm if (!token.empty()).

+0

STD :: di chuyển trong trường hợp này là gì? Có cần thiết không? Tôi biên dịch mà không có nó kể từ khi tôi không sử dụng C++ 11, và nó chỉ tốt. Nhưng mục đích trong trường hợp này là gì? –

+4

@ user1944429: Di chuyển tránh sao chép dữ liệu chuỗi. Vì bạn không còn sử dụng nó trong vòng lặp, nên việc vectơ "ăn cắp" dữ liệu đó trực tiếp mà không cần sao chép nó có ý nghĩa. –

+0

nó bỏ lỡ một trường hợp, trong trường hợp đầu vào của "a, b, c, d," , nó sẽ trả về 5 giá trị bao gồm cả giá trị cuối cùng, nhưng không –

11

Thư viện tiêu chuẩn không bao gồm tương đương trực tiếp, nhưng nó là một câu khá dễ dàng để viết. Là C++, bạn thường không muốn viết cụ thể cho một mảng mặc dù - thay vào đó, bạn thường muốn viết đầu ra cho một trình lặp, do đó, nó có thể đi đến một mảng, vectơ, luồng, v.v. một cái gì đó theo thứ tự chung này:

template <class OutIt> 
void explode(std::string const &input, char sep, OutIt output) { 
    std::istringstream buffer(input); 

    std::string temp; 

    while (std::getline(buffer, input, sep)) 
     *output++ = temp; 
} 
Các vấn đề liên quan