扩展列表的大小

时间:2013-11-06 00:14:26

标签: c++

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

现在我有一个包含字符串的数组,并且数组的大小设置为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开始设置。我改变了订单并开始工作。

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

_____________________________________________________________________________________

REFLECTION

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

5 个答案:

答案 0 :(得分:1)

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

您可能需要考虑使用std::vector将字符串存储在班级内。这将允许您根据需要增长和缩小容器。

但是如果你要在课堂上使用stl容器,我不明白为什么你不会只使用std::list来开始。

答案 1 :(得分:1)

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

有关链接列表的更多信息here

否则,无论何时“长出”当前列表,您都必须展开列表并将旧列表中的所有对象复制到新列表中。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

  

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

除非我误解你,否则听起来你的意思是只是通过增加N来获得理想的行为。

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

答案 4 :(得分:-1)

与JBarberU所说的最好的赌注是链接列表。但是,如果您希望对其进行索引,则可以创建具有大小和容量的动态数组类,每次向数组添加字符串时,都会增加大小,如果要添加到数组中,则会超过然后,大小创建一个新数组,两倍大,并复制所有值。