2011-09-09 29 views
1

假设在我希望用户指定的整数代码(比如x)和然后分配在计算机存储器中的那些许多连续单元上怎么办某种处理。新双[X]对矢量<double>(x),其中整数x是用户指定

我的问题是它是“更好”来分配此内存为new double[x]vector<double>(x)

我知道,这两种方法似乎很好地工作(即编译并在此蝇头小码至少运行)

int x; int* p; 
    cout<<"Enter integer x:";cin>>x; 
    vector<double> v(x); 
    p=new double[x] 

如果你认为答案是使用new那么是否有可能以某种方式奇迹般地转换 通过new分配的内存转换为向量?因为矢量会给我更多的操作数据的能力。

+0

这是非建设性的,直到你定义“更好”。 –

回答

8

这是更好地使用vector时,你可以的,因为它提供了许多优势(自动内存管理,边界检查等)。

此外,为了让矢量保留一些元素供您使用(即在存储器中一次分配多个元素,而不是在添加元素时最终调整它的大小),可以将该数字传递给矢量构造函数:

int x; 
cout<<"Enter integer x:";cin>>x; 
vector<double> v(x); 

或者,如果你已经创建了一个载体,应用vector::resize

// created v somewhere up here and we want to reuse it 
int x; 
cout << "Enter integer x: "; cin >> x; 
v.resize(x); 

而且没有,有没有办法告诉向量,除非你用用的内存,你已经分配一个自定义分配器[R. Martinho Fernandes,评论]。

+0

实际上,有一种方法可以告诉矢量使用预分配的内存:使用自定义分配器! –

+0

@Martinho哦,忘了那些:)更新。 –

+0

谢谢Seth,Mark和R. Martinho的回答! – smilingbuddha

0

你应该总是喜欢在矢量新的,因为它免除您担心内存管理。矢量使用新的封面,但隐藏你的细节。

有没有办法让矢量使用您已经用新分配的缓冲区,而且也实在没有理由去尝试。

1

正如其他人所说的,它通常总是最好使用一个载体。然而,给一个对位,这里有一些可能的情况下,当一个数组可能会更好:

  • 内存极为有限(例如,在简单的单片机嵌入式编程)。向量通常保留比存储其元素所需要的更大的数组,并且还具有一些额外的内存开销以跟踪诸如列表中项目的数量之类的事情。
  • 您需要与不了解矢量类的C代码进行互操作。在这种情况下,您需要将数据从矢量复制到数组,将数组传递给C代码,然后在C代码完成后取消分配数组。
  • 您知道列表中元素的确切数量,该数字永远不会改变。即使在这种情况下,使用矢量可能也更好。

如果您必须使用数组,那么最好在可能的情况下将其分配到堆栈上。例如...

char my_array[ 100 ]; // allocated on stack - better 
char* my_array_2 = new char[ 100 ]; // allocated on heap - worse 

第一个例子是更好,因为内存会被自动回收,一旦你的代码离开该阵列中定义的块。但是,你只能在栈上分配,如果你事先知道的大小阵列。如果大小在运行时可能会更改,那么不幸的是,您必须在堆上进行分配。

int x = 20 + some_num; 
char my_array[ x ]; // error - won't compile 
+0

需要注意的是,您可以将矢量所在的指针传递给一个C函数(或者只是一个接受指针的函数),以便能够以多种方式将它用作数组,可能最常见的是' &VEC [0]'。但是有一些注意事项,所以一般情况下它不好,除非你确切知道C函数的工作原理。 –

+0

“通常总是更好” –

+0

顺便说一句,值得注意的是'char my_array [x];'可能编译得非常好,即使它是UB。我见过一个C++ 03编译器无法检测到像'void foo(const int x){char a [x]; } int main(){int x = 3; FOO(3); }'在某些情况下(尽管C++ 11编译器可能会拒绝_all_非'constexpr'数组维度)。 –

相关问题