【问题标题】:One question about element inserting in STL list关于在 STL 列表中插入元素的一个问题
【发布时间】:2009-06-07 15:19:58
【问题描述】:
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中的操作感到困惑

分支。

它是创建一个新元素并将其插入到前面元素之后还是 只是在列表的第一个元素之后放置一个新元素?

【问题讨论】:

    标签: c++ memory list stl


    【解决方案1】:

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

    【讨论】:

    • 它是一个指针列表,所以它正在修改前面列表元素所指向的东西。
    • @Neil:如果迭代新列表,修改后的列表是否必须处理第一个元素或像往常一样迭代?
    • @Neil,是的,但这不应该影响列表的排序结构。这似乎是 OP 所要求的。
    【解决方案2】:

    它不会创建新元素——只是将 s 中的数据附加到前面元素中已经存在的数据中,如果有空间的话。但是,编写的代码非常混乱。

    【讨论】:

      【解决方案3】:

      据我所知(您的摘录中缺少一些重要代码),您有一个数据块,它本质上是一个 Stringdata 对象数组,以及一个指向该块的指针列表。 else 块正在扩展该数组。

      使用vector&lt;Stringdata&gt; 可能比list&lt;Stringdata*&gt; 更好

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-18
        • 2019-11-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-15
        相关资源
        最近更新 更多