我正在写一个包含字符串的类。它基本上是一个容纳字符串的容器。我想知道如何随着容器变大而扩大容器的大小。
现在我有一个包含字符串的数组,并且数组的大小设置为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
的值,则数组的大小会重新分配到该大小。我认为,由于数组是在创建对象时创建的,因此数组不会改变大小,但在编写和运行某些函数之后,它正是这样做的。
答案 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所说的最好的赌注是链接列表。但是,如果您希望对其进行索引,则可以创建具有大小和容量的动态数组类,每次向数组添加字符串时,都会增加大小,如果要添加到数组中,则会超过然后,大小创建一个新数组,两倍大,并复制所有值。