2010-10-29 37 views
10

Tôi muốn chia một chuỗi dọc theo khoảng trắng và tôi biết rằng mã thông báo thể hiện các số nguyên hợp lệ. Tôi muốn chuyển đổi các thẻ thành số nguyên và điền một vectơ với chúng.C++: Cách thanh lịch để chia chuỗi và nội dung công cụ thành tiêu chuẩn :: vector

Tôi có thể sử dụng tăng :: tách, tạo một vectơ của chuỗi mã thông báo, sau đó sử dụng std :: transform.

Giải pháp của bạn là gì? Sử dụng boost là chấp nhận được.

+3

thể trùng lặp của [Làm thế nào để tokenize một chuỗi trong C++?] (Http://stackoverflow.com/questions/53849/how-do-i-tokenize-a-string-in-c) - xem câu trả lời từ @KeithB –

+18

Làm thế nào về một số ví dụ sau đây: http: //www.codeproject. com/KB/công thức nấu ăn/Tokenizer.aspx Họ rất hiệu quả và phần nào thanh lịch. Thư viện String Toolkit làm cho việc xử lý chuỗi phức tạp trong C++ đơn giản và dễ dàng. –

Trả lời

8

Something như thế này:

std::istringstream iss("42 4711 "); 
std::vector<int> results(std::istream_iterator<int>(iss) 
         , std::istream_iterator<int>()); 

?

3

Bạn có thể sử dụng Boost.Tokenizer. Nó có thể dễ dàng được bao bọc thành một hàm explode_string lấy một chuỗi và dấu tách và trả về một vectơ mã thông báo.

Sử dụng transform trên véc tơ trả về là ý tưởng tốt cho việc chuyển đổi từ chuỗi thành int; bạn cũng có thể chuyển trình lặp Boost.Tokenizer thành thuật toán transform.

+0

Có cách nào sử dụng boost :: tokenizer với mã thông báo tùy ý không? Dường như nó hoạt động với các ký tự như ''', ',', '(', ')', ';''. Có cách nào để sử dụng ví dụ '' m'' làm mã thông báo không? – user3728501

0

Bạn luôn có thể sử dụng strtok hoặc string.find(). thư viện thuật toán chuỗi

1

Sử dụng Boost để split chuỗi thành một vector của chuỗi, sau đó std::for_each và một trong hai atoi hoặc boost::lexical_cast để biến chúng thành int s. Nó có thể đơn giản hơn nhiều so với các phương pháp khác, nhưng có thể không có hiệu suất cao nhất do bản sao (nếu ai đó có cách cải thiện và loại bỏ điều đó, vui lòng nhận xét).

std::vector<int> numbers; 

void append(std::string part) 
{ 
    numbers.push_back(boost::lexical_cast<int>(part)); 
} 

std::string line = "42 4711"; // borrowed from sbi's answer 
std::vector<std::string> parts; 
split(parts, line, is_any_of(" ,;")); 
std::for_each(parts.being(), parts.end(), append); 

Gần đúng.

http://www.boost.org/doc/libs/1_44_0/doc/html/string_algo.html http://www.boost.org/doc/libs/1_44_0/libs/conversion/lexical_cast.htm

Các vấn đề liên quan