关于STL列表中元素插入的一个问题

时间:2009-06-07 15:19:58

标签: c++ memory list stl

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 个答案:

答案 0 :(得分:1)

您的代码似乎都没有。 else分支中的代码根本不会修改strings_结构。代码只修改列表前面的元素返回。这应该对实际的列表结构没有影响。

答案 1 :(得分:0)

它不会创建新元素 - 只需将s中的数据附加到前面元素中的数据(如果有空格)。但是,编写的代码非常容易混淆。

答案 2 :(得分:0)

据我所知(你的摘录中遗漏了一些重要的代码),你有一个数据块,它本质上是一个Stringdata对象的数组,还有一个列表&lt;&gt;指向该块的指针。 else块正在扩展该数组。

使用vector<Stringdata>而不是list<Stringdata*>

可能会更好