【问题标题】:How can I make a std::list of arrays?如何制作 std::list 数组?
【发布时间】:2010-06-22 21:26:41
【问题描述】:

我想创建一个 std::list 数组。具体来说,我想要一个 Borland Code Builders AnsiStrings 的数组列表。

真正的问题是我希望动态分配数组。如何定义列表?我在这里迷路了,我不知道要开始。

std::list<???> myList;

我在尖括号内放了什么?我尝试过的任何方法都行不通。

【问题讨论】:

  • 那个 AnsiString 和 BCB 一样吗?
  • 您应该始终将“动态数组”与“std::vector”相关联。您应该将“字符串”与“std::string”相关联。你应该将“最后的手段”与“std::list”联系起来。 :)(为什么是列表?)
  • @sbi 是的。应该更具体。

标签: c++ list std


【解决方案1】:
typedef std::vector<char> char_array;
typedef std::list<char_array> char_array_list;

或者更恰当地说:

typedef std::list<std::string> string_list;

【讨论】:

  • 或者,最合适的:typedef std::vector&lt;std::string&gt; string_container; +1
【解决方案2】:
std::list<std::vector<char>> myList;

std::vector&lt;&gt; 是正确处理动态数组的 c++ 方式。很少需要直接使用new T[42] 来创建数组。

std::vector<char> vc;
char ansi_str[] = &vc[0];

上述代码中的ansi_str 由C++03 标准定义为数组中第一个元素的地址(在C++98 中允许返回一个代理)。

如果您真的想将AnsiStrings 用作字符串,最好使用std::string 而不是std::vector&lt;char&gt;。然后,您将免费获得所有 C++ 不错的字符串功能,并且您仍然可以使用 std::string::data() 访问原始数据。使用std::string 的一个缺点是原始数据不可用于修改。如果您的AnsiStrings api 需要修改数据,您将被std::vector 卡住。

【讨论】:

  • 您可能需要修复&gt;&gt;上的间距
  • 可以使用&amp;myString[0]修改字符串的原始数据。
  • @Billy:务实地可以,但当前标准不要求在连续空间中分配字符串,某些实现可能使用写时复制语义,并且......你可以假设运行陷入各种麻烦。在现实生活中,所有字符串实现都是连续的。我不确定是否还有写时复制语义(这是多线程的问题)。顺便说一句,c++0x 要求字符串内容是连续的。
  • @Pete 我知道 C++0x 改变了规则,但 C++0x 还不是官方的。
  • @sbi:我们不应该让他这么轻易下车。 :)
【解决方案3】:

不要让它成为数组列表,使用std::vector。那么它将是std::list&lt;std::vector&lt;AnsiString&gt; &gt;。您可以使用resizepush_back 将字符串添加到向量中。

【讨论】:

    【解决方案4】:

    为什么不把 std::list 改为 std::strings 呢?

    但是,你为什么要使用 ansi 字符串? Ansi 字符串被视为“文本犯罪”。

    【讨论】:

      猜你喜欢
      • 2020-06-01
      • 2020-12-22
      • 1970-01-01
      • 2013-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-15
      相关资源
      最近更新 更多