Один вопрос о вставке элемента в список STL - PullRequest
0 голосов
/ 07 июня 2009
CODE:

struct Stringdata
{
  // Length of data in buffer.
  size_t len;
  // Allocated size of buffer.
  size_t alc;
  // Buffer.
  char data[1];
};

typedef std::list<Stringdata*> Stringdata_list;
Stringdata_list strings_;

Stringdata *psd = this->strings_.front();

//...
if (len > psd->alc - psd->len)
alc = sizeof(Stringdata) + buffer_size;
else
{
  char* ret = psd->data + psd->len;
  memcpy(ret, s, len - sizeof(Stringpool_char));
  memset(ret + len - sizeof(Stringpool_char), 0,
     sizeof(Stringpool_char));

  psd->len += len;

  return reinterpret_cast<const Stringpool_char*>(ret);
}

В приведенном выше примере кода я запутался в операциях в else

ветвь.

Создает ли он новый элемент и вставляет его после переднего элемента или просто поместить новый элемент после первого элемента списка?

Ответы [ 3 ]

1 голос
/ 07 июня 2009

Ваш код, кажется, не делает ни того, ни другого. Код в ветви else не изменяет структуру strings_. Код только изменяет возвращаемый элемент с начала списка. Это не должно влиять на фактическую структуру списка.

0 голосов
/ 07 июня 2009

Насколько я могу судить (какой-то важный код отсутствует в вашем отрывке), у вас есть блок данных, который по сути является массивом объекта Stringdata, и список <> указателей на этот блок. Блок else расширяет этот массив.

Вам, вероятно, будет лучше с vector<Stringdata>, чем с list<Stringdata*>

0 голосов
/ 07 июня 2009

Он не создает новый элемент - просто добавляет данные из s к данным, которые уже находятся в переднем элементе, если есть место. Хотя очень запутанно написанный код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...