#include <iostream>
#include <string>
#include <utility>
#include <vector>
namespace {
template <typename T>
class MyAllocator {
public:
using value_type = T;
MyAllocator(std::string iType) : _type(std::move(iType)) {}
T* allocate(const std::size_t iNo) { return new T[iNo]; }
void deallocate(T* iPtr, const std::size_t) { delete[] iPtr; }
constexpr bool operator!=(const MyAllocator& oth) const {
return _type != oth._type;
}
const std::string& getType() const noexcept { return _type; }
private:
std::string _type;
};
using MyString =
std::basic_string<char, std::char_traits<char>, MyAllocator<char>>;
} // anonymous namespace
int main(int, char**) {
::MyString str1(::MyAllocator<char>("ForStr1"));
::MyString str2(::MyAllocator<char>("ForStr2"));
::MyString str3(::MyAllocator<char>("ForStr3"));
std::vector<::MyString> aVector;
aVector.reserve(1024);
aVector.push_back(str1);
aVector.push_back(str2);
std::cout << "[0]: " << aVector[0].get_allocator().getType() << "\n"
<< "[1]: " << aVector[1].get_allocator().getType() << "\n";
aVector.insert(aVector.begin(), str3);
const auto& type0 = aVector[0].get_allocator().getType();
const auto& type1 = aVector[1].get_allocator().getType();
const auto& type2 = aVector[2].get_allocator().getType();
std::cout << "[0]: " << type0 << "\n"
<< "[1]: " << type1 << "\n"
<< "[2]: " << type2 << "\n";
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8dXRpbGl0eT4KI2luY2x1ZGUgPHZlY3Rvcj4KCm5hbWVzcGFjZSB7Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KY2xhc3MgTXlBbGxvY2F0b3IgewogcHVibGljOgogIHVzaW5nIHZhbHVlX3R5cGUgPSBUOwoKICBNeUFsbG9jYXRvcihzdGQ6OnN0cmluZyBpVHlwZSkgOiBfdHlwZShzdGQ6Om1vdmUoaVR5cGUpKSB7fQoKICBUKiBhbGxvY2F0ZShjb25zdCBzdGQ6OnNpemVfdCBpTm8pIHsgcmV0dXJuIG5ldyBUW2lOb107IH0KICB2b2lkIGRlYWxsb2NhdGUoVCogaVB0ciwgY29uc3Qgc3RkOjpzaXplX3QpIHsgZGVsZXRlW10gaVB0cjsgfQoKICBjb25zdGV4cHIgYm9vbCBvcGVyYXRvciE9KGNvbnN0IE15QWxsb2NhdG9yJiBvdGgpIGNvbnN0IHsKICAgIHJldHVybiBfdHlwZSAhPSBvdGguX3R5cGU7CiAgfQoKICBjb25zdCBzdGQ6OnN0cmluZyYgZ2V0VHlwZSgpIGNvbnN0IG5vZXhjZXB0IHsgcmV0dXJuIF90eXBlOyB9CgogcHJpdmF0ZToKICBzdGQ6OnN0cmluZyBfdHlwZTsKfTsKCnVzaW5nIE15U3RyaW5nID0KICAgIHN0ZDo6YmFzaWNfc3RyaW5nPGNoYXIsIHN0ZDo6Y2hhcl90cmFpdHM8Y2hhcj4sIE15QWxsb2NhdG9yPGNoYXI+PjsKCn0gIC8vIGFub255bW91cyBuYW1lc3BhY2UKCmludCBtYWluKGludCwgY2hhcioqKSB7CiAgOjpNeVN0cmluZyBzdHIxKDo6TXlBbGxvY2F0b3I8Y2hhcj4oIkZvclN0cjEiKSk7CiAgOjpNeVN0cmluZyBzdHIyKDo6TXlBbGxvY2F0b3I8Y2hhcj4oIkZvclN0cjIiKSk7CiAgOjpNeVN0cmluZyBzdHIzKDo6TXlBbGxvY2F0b3I8Y2hhcj4oIkZvclN0cjMiKSk7CgogIHN0ZDo6dmVjdG9yPDo6TXlTdHJpbmc+IGFWZWN0b3I7CiAgYVZlY3Rvci5yZXNlcnZlKDEwMjQpOwogIAogIGFWZWN0b3IucHVzaF9iYWNrKHN0cjEpOwogIGFWZWN0b3IucHVzaF9iYWNrKHN0cjIpOwogIAogICAgc3RkOjpjb3V0IDw8ICJbMF06ICIgPDwgYVZlY3RvclswXS5nZXRfYWxsb2NhdG9yKCkuZ2V0VHlwZSgpIDw8ICJcbiIKICAgICAgICAgICAgICA8PCAiWzFdOiAiIDw8IGFWZWN0b3JbMV0uZ2V0X2FsbG9jYXRvcigpLmdldFR5cGUoKSA8PCAiXG4iOwoKCiAgYVZlY3Rvci5pbnNlcnQoYVZlY3Rvci5iZWdpbigpLCBzdHIzKTsKCiAgY29uc3QgYXV0byYgdHlwZTAgPSBhVmVjdG9yWzBdLmdldF9hbGxvY2F0b3IoKS5nZXRUeXBlKCk7CiAgY29uc3QgYXV0byYgdHlwZTEgPSBhVmVjdG9yWzFdLmdldF9hbGxvY2F0b3IoKS5nZXRUeXBlKCk7CiAgY29uc3QgYXV0byYgdHlwZTIgPSBhVmVjdG9yWzJdLmdldF9hbGxvY2F0b3IoKS5nZXRUeXBlKCk7CgogIHN0ZDo6Y291dCA8PCAiWzBdOiAiIDw8IHR5cGUwIDw8ICJcbiIKICAgICAgICAgICAgPDwgIlsxXTogIiA8PCB0eXBlMSA8PCAiXG4iCiAgICAgICAgICAgIDw8ICJbMl06ICIgPDwgdHlwZTIgPDwgIlxuIjsKCiAgcmV0dXJuIDA7Cn0K