Иногда полезно использовать начальный адрес std::vector
и временно рассматривать этот адрес как адрес регулярно выделяемого буфера.
Например, замените это:
char* buf = new char[size];
fillTheBuffer(buf, size);
useTheBuffer(buf, size);
delete[] buf;
С этим:
vector<char> buf(size);
fillTheBuffer(&buf[0], size);
useTheBuffer(&buf[0], size);
Преимущество этого, конечно, в том, что буфер освобождается автоматически, и мне не нужно беспокоиться о delete[]
.
Проблема, с которой я сталкиваюсь, это когда размер == 0. В этом случае первая версия работает нормально. Пустой буфер «выделяется», и последующие функции ничего не делают размер, который они получают размер == 0.
Однако вторая версия дает сбой, если size == 0, так как вызов buf[0]
может справедливо содержать утверждение, что 0 < size
.
Так есть ли альтернатива идиоме &buf[0]
, которая возвращает адрес начала вектора, даже если вектор пуст?
Я также рассматривал возможность использования buf.begin()
, но в соответствии со стандартом даже не гарантированно возвращать указатель.