#include <vector>
#include <iostream>
class String
{
public:
//! default constructor
String();
//! constructor taking C-style string i.e. a char array terminated with'\0'.
explicit String(const char * const c);
//! copy constructor
explicit String(const String& s);
//! move constructor
String(String&& s) noexcept;
//! operator =
String& operator = (const String& rhs);
//! move operator =
String& operator = (String&& rhs) noexcept;
//! destructor
~String();
//! members
char* begin() const { return elements; }
char* end() const { return first_free; }
std::size_t size() const {return first_free - elements; }
std::size_t capacity() const {return cap - elements; }
private:
//! data members
char* elements;
char* first_free;
char* cap;
std::allocator<char> alloc;
//! utillities for big 3
void free();
};
//! default constructor
String::String():
elements (nullptr),
first_free (nullptr),
cap (nullptr)
{}
//! copy constructor
String::String(const String &s)
{
char* newData = alloc.allocate(s.size());
std::uninitialized_copy(s.begin(), s.end(), newData);
elements = newData;
cap = first_free = newData + s.size();
std::cout << "Copy constructing......\n";
}
//! move constructor
String::String(String &&s) noexcept :
elements(s.elements), first_free(s.first_free), cap(s.cap)
{
s.elements = s.first_free = s.cap = nullptr;
std::cout << "Move constructing......\n";
}
String::~String()
{
// leaky leaky
}
String& String::operator = (String&& rhs) noexcept
{
String temp(rhs);
std::swap(elements, temp.elements);
std::swap(first_free, temp.first_free);
std::swap(cap, temp.cap);
return *this;
}
int main()
{
std::vector<String> v;
String s;
for (unsigned i = 0; i != 4; ++i)
v.push_back(s);
return 0;
}
I2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPGlvc3RyZWFtPgoKY2xhc3MgU3RyaW5nCnsKcHVibGljOgogICAgLy8hIGRlZmF1bHQgY29uc3RydWN0b3IKICAgIFN0cmluZygpOwoKICAgIC8vISBjb25zdHJ1Y3RvciB0YWtpbmcgQy1zdHlsZSBzdHJpbmcgaS5lLiBhIGNoYXIgYXJyYXkgdGVybWluYXRlZCB3aXRoJ1wwJy4KICAgIGV4cGxpY2l0IFN0cmluZyhjb25zdCBjaGFyICogY29uc3QgYyk7CgogICAgLy8hIGNvcHkgY29uc3RydWN0b3IKICAgIGV4cGxpY2l0IFN0cmluZyhjb25zdCBTdHJpbmcmIHMpOwoKICAgIC8vISBtb3ZlIGNvbnN0cnVjdG9yICAgIAogICAgU3RyaW5nKFN0cmluZyYmIHMpIG5vZXhjZXB0OwoKICAgIC8vISBvcGVyYXRvciA9CiAgICBTdHJpbmcmIG9wZXJhdG9yID0gKGNvbnN0IFN0cmluZyYgcmhzKTsKCiAgICAvLyEgbW92ZSBvcGVyYXRvciA9ICAgICAKICAgIFN0cmluZyYgb3BlcmF0b3IgPSAoU3RyaW5nJiYgcmhzKSBub2V4Y2VwdDsKCiAgICAvLyEgZGVzdHJ1Y3RvcgogICAgflN0cmluZygpOwoKICAgIC8vISBtZW1iZXJzCiAgICBjaGFyKiBiZWdpbigpIGNvbnN0ICB7IHJldHVybiBlbGVtZW50czsgICB9CiAgICBjaGFyKiBlbmQoKSAgIGNvbnN0ICB7IHJldHVybiBmaXJzdF9mcmVlOyB9CgogICAgc3RkOjpzaXplX3Qgc2l6ZSgpICAgICBjb25zdCB7cmV0dXJuIGZpcnN0X2ZyZWUgLSBlbGVtZW50czsgIH0KICAgIHN0ZDo6c2l6ZV90IGNhcGFjaXR5KCkgY29uc3Qge3JldHVybiBjYXAgLSBlbGVtZW50czsgICAgICAgICB9Cgpwcml2YXRlOgoKICAgIC8vISBkYXRhIG1lbWJlcnMKICAgIGNoYXIqIGVsZW1lbnRzOwogICAgY2hhciogZmlyc3RfZnJlZTsKICAgIGNoYXIqIGNhcDsKCiAgICBzdGQ6OmFsbG9jYXRvcjxjaGFyPiBhbGxvYzsKCiAgICAvLyEgdXRpbGxpdGllcyBmb3IgYmlnIDMKICAgIHZvaWQgZnJlZSgpOwoKfTsKCi8vISBkZWZhdWx0IGNvbnN0cnVjdG9yClN0cmluZzo6U3RyaW5nKCk6CiAgICBlbGVtZW50cyAgICAobnVsbHB0ciksCiAgICBmaXJzdF9mcmVlICAobnVsbHB0ciksCiAgICBjYXAgICAgICAgICAobnVsbHB0cikKe30KCi8vISBjb3B5IGNvbnN0cnVjdG9yClN0cmluZzo6U3RyaW5nKGNvbnN0IFN0cmluZyAmcykKewogICAgY2hhciogbmV3RGF0YSA9IGFsbG9jLmFsbG9jYXRlKHMuc2l6ZSgpKTsKICAgIHN0ZDo6dW5pbml0aWFsaXplZF9jb3B5KHMuYmVnaW4oKSwgcy5lbmQoKSwgbmV3RGF0YSk7CgogICAgZWxlbWVudHMgPSBuZXdEYXRhOwogICAgY2FwID0gZmlyc3RfZnJlZSA9IG5ld0RhdGEgKyBzLnNpemUoKTsKCiAgICBzdGQ6OmNvdXQgPDwgIkNvcHkgY29uc3RydWN0aW5nLi4uLi4uXG4iOwp9CgovLyEgbW92ZSBjb25zdHJ1Y3RvciAgICAKU3RyaW5nOjpTdHJpbmcoU3RyaW5nICYmcykgbm9leGNlcHQgOgogICAgZWxlbWVudHMocy5lbGVtZW50cyksIGZpcnN0X2ZyZWUocy5maXJzdF9mcmVlKSwgY2FwKHMuY2FwKQp7CiAgICBzLmVsZW1lbnRzID0gcy5maXJzdF9mcmVlID0gcy5jYXAgPSBudWxscHRyOwogICAgc3RkOjpjb3V0IDw8ICJNb3ZlIGNvbnN0cnVjdGluZy4uLi4uLlxuIjsKfQoKU3RyaW5nOjp+U3RyaW5nKCkKewogICAgLy8gbGVha3kgbGVha3kKfQoKU3RyaW5nJiBTdHJpbmc6Om9wZXJhdG9yID0gKFN0cmluZyYmIHJocykgbm9leGNlcHQKewogICAgU3RyaW5nIHRlbXAocmhzKTsKICAgIHN0ZDo6c3dhcChlbGVtZW50cywgdGVtcC5lbGVtZW50cyk7CiAgICBzdGQ6OnN3YXAoZmlyc3RfZnJlZSwgdGVtcC5maXJzdF9mcmVlKTsKICAgIHN0ZDo6c3dhcChjYXAsIHRlbXAuY2FwKTsKICAgIHJldHVybiAqdGhpczsKfQoKaW50IG1haW4oKQp7CiAgICBzdGQ6OnZlY3RvcjxTdHJpbmc+IHY7CiAgICBTdHJpbmcgczsKICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gNDsgKytpKQogICAgICAgIHYucHVzaF9iYWNrKHMpOwoKICAgIHJldHVybiAwOwp9Cg==