0

我正在编写一个包含字符串的类。它基本上是一个可以容纳字符串的容器。我想知道随着容器变大如何扩展容器的大小。

现在我有一个包含字符串的数组,数组的大小设置为 10。我曾考虑过创建一个二维数组,但由于无论如何都会任意分配大小,所以不要认为这会产生任何影响。

class stringlist {
public:
    typedef std::string str;
    void push(str);
    void pop();
    void print();
private:
    str container[10];
};
void stringlist::push(str s)
{
    size_t sz = sizeof(container) / sizeof(*container);
    str* ptr = container;
    while(ptr[sz] != "" && *ptr != "")
        ++ptr;
    *ptr = s;
}
void stringlist::pop()
{
    size_t sz = sizeof(container) / sizeof(*container);
    str* ptr = container;
    while(ptr != ptr + sz)
        ++ptr;
    *ptr = "";
}
void stringlist::print()
{
    size_t sz = sizeof(container) / sizeof(*container);
    str* ptr = container;
    while(ptr[sz] != "" && *ptr != "")
        std::cout << *ptr++ << " ";
    std::cout << std::endl;
}

EDIT

基本上我正在寻找某种动态内存分配。str* container = new str[N]哪里N可以指定。但我不确定如何在事先不知道 N 的情况下实施。

如果我使用构造函数,我会得到一个错误:

public:
    stringlist() : N(15) {}
    stringlist(size_t sz) : N(sz) {}
private:
    str* container = new str[N];
    size_t N;

ERROR

a.out(29866,0x7fff76388310) malloc: *** mach_vm_map(size=3377629375143936) failed (error code=3)
*** error: can't allocate region
*** set a breakpoint in malloc_error_break to debug
libc++abi.dylib: terminating with uncaught exception of type std::bad_alloc: std::bad_alloc

EDIT

我实际上让它与构造函数方法一起工作。N在分配给我错误的容器后,我设置了 begin 的值。我切换了顺序并开始工作。

NOTE:这还没有解决我添加元素时列表增长的问题。

_____________________________________________________________________________________

REFLECTION

似乎如果我更改数据成员的值,N则数组的大小会重新分配为该大小。我认为,由于数组是在创建对象时创建的,因此数组不会改变大小,但是在编写和运行一些函数之后,它就是这样做的。

4

5 回答 5

1

str container[10];是一个由十个字符串组成的固定大小的数组。这意味着即使您尚未添加任何字符串,您的班级也会有 10 个字符串。

您可能需要考虑使用 astd::vector将您的字符串存储在您的类中。这将允许您根据需要扩大和缩小容器。

但是,如果您要在班级中使用 stl 容器,我不明白您为什么不直接使用 astd::list开始。

于 2013-11-06T00:22:17.017 回答
1

如果您只需要一个类似堆栈的容器(其中唯一有用的操作是推送、弹出和可能的迭代),您可能希望使用链接列表而不是索引列表。

更多关于链表的信息在这里

否则,每当您“退出”当前列表时,您都必须扩展列表并将旧列表中的所有对象复制到新列表中。

于 2013-11-06T00:39:29.987 回答
0

数组是静态数据结构,这意味着它们具有固定的数据大小。您可以通过为您的原因创建和使用适当的数据结构来动态分配内存,或者(推荐)您可以使用 STL 的通用类,例如vector、list、map等。

于 2013-11-06T00:58:37.773 回答
0

似乎如果我更改数据成员 N 的值,则数组的大小会重新分配为该大小。我认为,由于数组是在创建对象时创建的,因此数组不会改变大小,但是在编写和运行一些函数之后,它就是这样做的。

除非我误解了你,否则听起来你的意思是你只需增加 N 就可以获得所需的行为。

如果你不将数组重新分配到新的大小,你最终会出现未定义的行为,有时会工作,有时会崩溃。如果另一个对象被分配到您的数组后面的空间,如果您继续向列表中添加元素,它将被覆盖。

于 2013-11-06T01:55:55.893 回答
-1

你最好的选择类似于上面JBarberU所说的链接列表。但是,如果您希望它被索引,您可以创建一个具有大小和容量的动态数组类,每次将字符串添加到数组时都会增加大小,如果您要添加到数组并且它会超过大小然后创建一个新数组,两倍大并复制所有值。

于 2013-11-06T00:50:41.770 回答