Saya ingin membersihkan dan menggunakan kembali ostringstream (dan buffer yang mendasarinya) sehingga aplikasi saya tidak perlu melakukan banyak alokasi. Bagaimana cara mereset objek ke keadaan awalnya?
Saya ingin membersihkan dan menggunakan kembali ostringstream (dan buffer yang mendasarinya) sehingga aplikasi saya tidak perlu melakukan banyak alokasi. Bagaimana cara mereset objek ke keadaan awalnya?
Jawaban:
Saya telah menggunakan urutan clear dan str di masa lalu:
// clear, because eof or other bits may be still set.
s.clear();
s.str("");
Yang telah melakukan hal untuk arus string input dan output. Atau, Anda dapat menghapus secara manual, lalu mencari urutan yang sesuai untuk memulai:
s.clear();
s.seekp(0); // for outputs: seek put ptr to start
s.seekg(0); // for inputs: seek get ptr to start
Itu akan mencegah beberapa realokasi dilakukan str
dengan menimpa apa pun yang ada di buffer keluaran saat ini. Hasilnya seperti ini:
std::ostringstream s;
s << "hello";
s.seekp(0);
s << "b";
assert(s.str() == "bello");
Jika Anda ingin menggunakan string untuk fungsi-c, Anda dapat menggunakan std::ends
, meletakkan penghentian null seperti ini:
std::ostringstream s;
s << "hello";
s.seekp(0);
s << "b" << std::ends;
assert(s.str().size() == 5 && std::strlen(s.str().data()) == 1);
std::ends
adalah relik dari deprecated std::strstream
, yang bisa menulis langsung ke array karakter yang Anda alokasikan di stack. Anda harus memasukkan null terminating secara manual. Namun, std::ends
tidak usang, saya rasa karena masih berguna seperti kasus di atas.
s.str("");
. auto str = s.str(); auto cstr = str.c_str(); file << cstr; s.clear(); s.seekp(0); s << ends;
boost::any a = 1; std::ostringstream buffer; buffer << a << std::ends; EXPECT_EQ( buffer.str(), "any<(int)1>" );
TestUtilsTest.cpp:27: Failure Expected: buffer.str() Which is: "any<(int)1>\0" To be equal to: "any<(int)1>"
dan jika saya menggunakan kembali dengan string panjang yang berbeda saya mendapatkan bit yang tersisa
s.seekp(0); s << std::ends; s.seekp(0);
Tampaknya ostr.str("")
panggilan itu berhasil.
Jika Anda akan menghapus buffer dengan cara yang akan membuatnya dihapus sebelum digunakan pertama kali, Anda harus menambahkan sesuatu ke buffer terlebih dahulu dengan MSVC.
struct Foo {
std::ostringstream d_str;
Foo() {
d_str << std::ends; // Add this
}
void StrFunc(const char *);
template<class T>
inline void StrIt(const T &value) {
d_str.clear();
d_str.seekp(0); // Or else you'll get an error with this seek
d_str << value << std::ends;
StrFunc(d_str.str().c_str()); // And your string will be empty
}
};
clear
akan menyebabkan yang failbit
menjadi set jika sungai kosong. Sementara hanya menelepon seekp
seharusnya hanya kembali jika tidak ada aliran.
Kamu tidak. Gunakan dua aliran dengan nama berbeda untuk kejelasan dan biarkan kompiler pengoptimal mengetahui bahwa ia dapat menggunakan kembali yang lama.
ostringstream
(berdasarkan data yang dibaca) dan kemudian harus menulis string yang dibangun di ostringstream
suatu tempat dari waktu ke waktu (misalnya setelah urutan karakter tertentu dibaca) dan mulai membangun string baru.