Cần giải thích về stringstream trong C++

std::string chuoi;
std::getline(std::cin, chuoi);
std::stringstream arr;
arr<<chuoi;
std::vector<std::string> word;
while(!arr.eof()) {
    std::string tmp;
    arr>>tmp;
    word.push_back(tmp);
}

đoạn code trên lưu từng từ vào vecto, nhưng anh chị nào giải thích giúp em cách hoạt động của sstream được không ạ, em tìm hiểu trên gg nhưng chỉ toàn là cách sử dụng .

em hiểu nó là 1 kiểu dữ liệu dùng để biến chuỗi thành stream như cin/cout ấy :V

edit: nhầm ostringstream với istringstream :V :V

istringstream thì biến string thành kiểu mới giống như cin
ostringstream thì tạo 1 biến mới giống như cout, dùng để format các kiểu dữ liệu khác thành kiểu chuỗi :V
stringstream thì vừa cin vừa cout dùng dễ nhầm lẫn lắm :V

code trên có thể xài std::istringstream là đủ, lúc khởi tạo thì biến chuỗi chuoi thành std::istringstream iss(chuoi); là được

cách hoạt động thì có thể nó là 1 chuỗi tạm gọi là buffer thôi :V nó xài 1 con trỏ hoặc 1 số nguyên ví dụ bufferIndex để lưu vị trí hiện tại của kí tự trong buffer, từ đó mà extract ra đúng kí tự tiếp theo.

ví dụ

std::string line = "ab cdef";
std::istringstream iss(line); // biến chuỗi line thành input stream, thực chất có thể là copy chuỗi line vào chuỗi iss.buffer, và gán iss.bufferIndex = 0
std::vector<std::string> words;
for (std::string word; iss >> word;) { // iss >> word gọi ví dụ iss.peek() là lấy ra
                                       // ký tự iss.buffer[bufferIndex], nếu ký tự đó là 
                                       // khoảng trắng thì ko lấy nữa, còn nếu ko phải 
                                       // là khoảng trắng thì gọi iss.get() là lấy 
                                       // iss.buffer[bufferIndex] và tăng ++bufferIndex
                                       // để tiếp tục đọc ký tự tiếp theo. Nếu bufferIndex
                                       // >= buffer.size() thì dừng và set flag iss.eof = true
    words.push_back(word);
}
6 Likes

à vâng em cảm ơn anh .

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?