2009-07-17 8 views
15

Tôi biết có token token nhưng có một "int tokenizer"?Int tokenizer

Ví dụ, tôi muốn chia chuỗi "12 34 46" và có:

danh sách [0] = 12

danh sách [1] = 34

danh sách [2 ] = 46

Đặc biệt, tôi tự hỏi liệu Boost :: Tokenizer có thực hiện việc này hay không. Mặc dù tôi không thể tìm thấy bất kỳ ví dụ nào không sử dụng chuỗi.

Trả lời

12

Có có: sử dụng một dòng, ví dụ một stringstream:

stringstream sstr("12 34 46"); 
int i; 
while (sstr >> i) 
    list.push_back(i); 

Ngoài ra, bạn cũng có thể sử dụng các thuật toán STL và/hoặc adapter iterator kết hợp với nhà thầu:

vector<int> list = vector<int>(istream_iterator<int>(sstr), istream_iterator<int>()); 
+0

Sexy, nhưng không cần thiết tiết lộ. 'vector danh sách (istream_iterator (sstr), istream_iterator ());' sẽ làm tốt. :) – avakar

+2

avakar: oddly, * no *, mã của bạn không hoạt động. Bạn có cần phải sử dụng hàm tạo rõ ràng (như được thực hiện bởi tôi) hay bao gồm một cặp dấu ngoặc bổ sung xung quanh một trong các đối số; nếu không, mã của bạn sẽ * không * làm việc - thay vào đó, đây là khai báo của một nguyên mẫu hàm gọi là 'list' với kiểu trả về' vector '. Hãy thử nó! –

+0

Tôi có nghĩa là dấu ngoặc đơn, không phải dấu ngoặc ôm. –

0

Điều bạn đang tìm kiếm là 2 hành động riêng biệt. Đầu tiên mã hóa chuỗi, sau đó chuyển đổi từng mã thông báo thành int.

0

tôi không chắc chắn nếu bạn có thể làm điều này mà không cần sử dụng chuỗi hoặc char * bởi vì bạn phải nhưng cả hai số và không gian vào cùng một bộ ...

14

Các C++ String Toolkit Library (StrTk) có giải pháp sau để vấn đề của bạn:

#include <string> 
#include <deque> 
#include "strtk.hpp" 

int main() 
{ 
    { 
     std::string data = "12 34 46"; 
     std::deque<int> int_list; 
     strtk::parse(data," ",int_list); 
    } 

    { 
     std::string data = "12.12,34.34|46.46 58.58"; 
     std::deque<double> double_list; 
     strtk::parse(data," ,|",double_list); 
    } 

    return 0; 
} 

Các ví dụ khác có thể được tìm thấy Here

Lưu ý: Quá trình phân tích cú pháp là EXTREMELY nhanh chóng và hiệu quả, đưa các giải pháp dựa trên stdlib và tăng cường đáng xấu hổ.