C++ 有没有办法在c++;?

C++ 有没有办法在c++;?,c++,arrays,C++,Arrays,我的程序中有以下数组: int foo[] = {1,2,3,4,5}; //Do something with foo, but then there's no use with it afterwards 由于我需要更多类似这样的“单次使用”数组,因此我希望按照以下方式重新定义它: foo[] = {5,2,3}; //Raises an error 请注意,数组大小可能会有所不同 我得到的唯一解决方案是为每次重新定义创建一个新的数组,但这会占用太多的存储空间 有没有办法重新定义?还是有

我的程序中有以下数组:

int foo[] = {1,2,3,4,5};
//Do something with foo, but then there's no use with it afterwards
由于我需要更多类似这样的“单次使用”数组,因此我希望按照以下方式重新定义它:

foo[] = {5,2,3}; //Raises an error
请注意,数组大小可能会有所不同


我得到的唯一解决方案是为每次重新定义创建一个新的数组,但这会占用太多的存储空间


有没有办法重新定义?还是有其他的解决方案?

< p>因为数组必须能够改变它的大小,你可以考虑使用代替原始数组并在需要新数组时重新分配向量:

#包括
#包括
int main(){
向量foo={1,2,3,4,5};
断言(foo.size()=5);

foo={5,2,3};//在这些“临时”变量的生存期内,您始终可以打开和关闭一个新的作用域:

void bar() {
    {
        int foo[] = {1, 2, 3, 4, 5};
        // Do something with the first foo
    }
    {
        int foo[] = {5, 2, 3};
        // Do something with the second foo
    }
}

是,数组不是第一类对象,但看起来更像是包含一系列对象的内存区域的开始。因此,C++不允许直接分配给数组。完全停止(BTW祖先C语言也不)。 解决办法:

  • 使用一个指向动态数组的指针。简单但它需要初始化每个新数组的内容。在重新使用指针之前,应该注意释放数组——而不是真正的C++哲学…
  • 使用vector。与前面的方法完全相同,但是很好地封装在vector类中,它将为您处理分配管理和当前大小
  • 使用一个与要使用的最长数组大小相同的数组,并将预期数据复制到该数组中
通过这些方式(除了向量,它对程序员更友好),您应该跟踪当前使用的长度

但是,如果原因是为了节省内存,最简单、最有效的方法是直接使用指向初始化数组的指针。如果可以在运行时提取初始化数据,那么它必须在生成时之后的某个位置出现,那么为什么不直接使用该内存(*)?我能想象的唯一缺点是,您将跟踪指向数组的长度



有一个明显的例外。在某些嵌入式系统中,初始化数据可以存储在只读内存中。在这种情况下,如果需要在内存中写入数据,则无法直接使用该内存…

“但这将占用太多的存储空间。”-你确定吗?如果一个变量不再使用,编译器很可能会重用它的存储。如果一个函数中有多个变量,也许你应该拆分该函数?一旦函数结束,它的堆栈空间肯定会被回收。看起来你真正想要的是一个。有没有办法重新定义?不是一个固定大小的数组t编译时间。简短回答:否。部分解释:数组可以在定义的位置初始化,但不能重新定义(即,在同一范围内定义的同名第二个数组)或重新分配。可以定义一个指针,该指针最初指向数组的第一个元素,然后将该指针重新分配给另一个数组的第一个元素(假设两个数组具有相同类型和不同名称的元素,并且指针指向同一类型)。在我看来,使用具有所有开销的运行时动态类型似乎不是解决OPs问题的方法。@Klaus数组必须能够改变其大小。不,在代码中的不同位置有两个具有相同名称的固定大小数组。可能的解决方案是使用一个持续存在的数组并更改其大小,即不再是一个数组,而是一些容器。但这是一种完全不同的方法!如果只在代码中添加4个大括号,那么添加这种开销似乎是不可接受的,而不会产生任何开销。请参阅DeducibleSteak的答案。仅我的意见!问题表明存储是问题,而不是cpu开销。请注意,两个数组{1,2,3,4,5}而{5,2,3}必须存储在程序的某个地方。可能不是在堆栈上,而是在某个地方。这就是数据首先进入向量的方式。但是,如果
foo
是数据成员,这将不起作用@眠りネロク 如果
foo
是一个数据成员,除了销毁包含对象并构造另一个相同类型的对象之外,什么都不起作用。数组不能以您寻求的方式重新分配。
void bar() {
    {
        int foo[] = {1, 2, 3, 4, 5};
        // Do something with the first foo
    }
    {
        int foo[] = {5, 2, 3};
        // Do something with the second foo
    }
}