Иногда полезно использовать начальный адрес std::vector
и временно рассматривать этот адрес как адрес регулярно распределяемого буфера.
Например заменить это:C++: получить адрес начала 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.
Вторая версия, однако, не работает, если размер == 0, так как вызов buf[0]
может справедливо содержать утверждение, что 0 < size
.
Так есть ли альтернатива идиоме &buf[0]
, которая возвращает адрес начала вектора, даже если вектор пуст?
Я также рассмотрел использование buf.begin()
, но в соответствии со стандартом даже не гарантированно вернуть указатель.
Это похоже на надзор в библиотеке STL. C++ позволяет вам выделять 'new T [0]' и возвращать действительный указатель для таких ситуаций, но большинство реализаций STL утверждают, что вы назначаете этот элемент или что-то еще. – AshleysBrain
Как узнать разницу между '& buf [0]' и 'buf [0] = 1'? – shoosh