有没有一种方法可以静态初始化C+中动态分配的数组+;? 在C++中,我可以静态初始化数组,例如: int a[] = { 1, 2, 3 };
有没有一种简单的方法可以将动态分配的数组初始化为一组立即值有没有一种方法可以静态初始化C+中动态分配的数组+;? 在C++中,我可以静态初始化数组,例如: int a[] = { 1, 2, 3 };,c++,arrays,initialization,c++11,C++,Arrays,Initialization,C++11,有没有一种简单的方法可以将动态分配的数组初始化为一组立即值 int *p = new int[3]; p = { 1, 2, 3 }; // syntax error …或者我必须手动复制这些值吗?不,您不能以相同的方式初始化动态创建的数组 大多数情况下,您会发现自己在静态初始化毫无意义的情况下使用动态分配。例如,当您有包含数千项的数组时。所以这通常不是什么大问题。不,不能用同样的方法初始化动态创建的数组 大多数情况下,您会发现自己在静态初始化毫无意义的情况下使用动态分配。例如,当您有包含数千
int *p = new int[3];
p = { 1, 2, 3 }; // syntax error
…或者我必须手动复制这些值吗?不,您不能以相同的方式初始化动态创建的数组
大多数情况下,您会发现自己在静态初始化毫无意义的情况下使用动态分配。例如,当您有包含数千项的数组时。所以这通常不是什么大问题。不,不能用同样的方法初始化动态创建的数组
大多数情况下,您会发现自己在静态初始化毫无意义的情况下使用动态分配。例如,当您有包含数千项的数组时。所以这通常不是什么大问题。您必须显式地分配动态数组的每个元素(例如,在for或while循环中)
但是语法
int*p=newint[3]()代码>会将所有元素初始化为0(值初始化$8.5/5)您必须显式地分配动态数组的每个元素(例如,在for或while循环中)
但是语法int*p=newint[3]()代码>将所有元素初始化为0(值初始化$8.5/5)您可以在C++0x中:
int* p = new int[3] { 1, 2, 3 };
...
delete[] p;
但我更喜欢向量:
std::vector<int> v { 1, 2, 3 };
std::向量v{1,2,3};
如果您没有C++0x编译器,boost可以帮助您:
#include <boost/assign/list_of.hpp>
using boost::assign::list_of;
vector<int> v = list_of(1)(2)(3);
#包括
使用boost::assign::list_;
向量v=第(1)(2)(3)项的列表;
您可以在C++0x中:
int* p = new int[3] { 1, 2, 3 };
...
delete[] p;
但我更喜欢向量:
std::vector<int> v { 1, 2, 3 };
std::向量v{1,2,3};
如果您没有C++0x编译器,boost可以帮助您:
#include <boost/assign/list_of.hpp>
using boost::assign::list_of;
vector<int> v = list_of(1)(2)(3);
#包括
使用boost::assign::list_;
向量v=第(1)(2)(3)项的列表;
从未听说过这样的事情,拥有这样的事情会很好
请记住,通过以这种方式在代码中初始化数组
int a[] = { 1, 2, 3 };
。。。。。只会让您更容易编写代码,而不会提高性能。
毕竟,无论采用哪种方式,CPU都会为数组赋值。从来没有听说过这样的事情,拥有它会很好
请记住,通过以这种方式在代码中初始化数组
int a[] = { 1, 2, 3 };
。。。。。只会让您更容易编写代码,而不会提高性能。
毕竟,CPU将完成为数组赋值的工作,无论您采用哪种方式。使用helper变量:
const int p_data[] = {1, 2, 3};
int* p = (int*)memcpy(new int[3], p_data, sizeof(p_data));
或者,一行
int p_data[] = {1, 2, 3}, *p = (int*)memcpy(new int[3], p_data, sizeof(p_data));
使用辅助变量:
const int p_data[] = {1, 2, 3};
int* p = (int*)memcpy(new int[3], p_data, sizeof(p_data));
或者,一行
int p_data[] = {1, 2, 3}, *p = (int*)memcpy(new int[3], p_data, sizeof(p_data));
为了避免无休止的推回,我通常初始化一个tr1::array
,并从结果中创建一个std::vector
(或任何其他容器std container)
const std::tr1::array<T, 6> values = {T(1), T(2), T(3), T(4), T(5), T(6)};
std::vector <T> vec(values.begin(), values.end());
尽管您不必明确提供元素的数量,但我更喜欢第一个版本。为了避免无休止的推回,我通常初始化tr1::array
,并从结果中创建std::vector
(或任何其他容器std container)
const std::tr1::array<T, 6> values = {T(1), T(2), T(3), T(4), T(5), T(6)};
std::vector <T> vec(values.begin(), values.end());
尽管您不必明确提供元素的数量,但我更喜欢第一个版本。+1
对于std::vector
。还有什么理由使用你自己的动态数组?@ NEU:如果你甚至不相信<代码> STD::向量,也许你应该完全放弃C++,去汇编语言。@ Poni:没有必要的理由来访问向量比访问数组慢得多。因此,任何声明其他方面的测试只适用于特定的编译器、编译器选项和库。请记住,一个实现可以执行额外的检查,许多实现在调试模式下或选择某些编译器选项时可以执行这些检查。@neuviemeporte:哪些访问器起作用?如果您觉得绝对需要保持控制,您可以编写类似于int*ptr=&v[0]的代码
和…ptr[i]…
,因为(从2003年起)向量内容存储保证是连续的。只要确保在向量大小增加时更改ptr
。@Poni:我们以前有过这个参数,所以它不是真的。看这里。()其中,我们最终证明向量和内置数组之间没有区别。+1
对于std::vector
。还有什么理由使用你自己的动态数组?@ NEU:如果你甚至不相信<代码> STD::向量,也许你应该完全放弃C++,去汇编语言。@ Poni:没有必要的理由来访问向量比访问数组慢得多。因此,任何声明其他方面的测试只适用于特定的编译器、编译器选项和库。请记住,一个实现可以执行额外的检查,许多实现在调试模式下或选择某些编译器选项时可以执行这些检查。@neuviemeporte:哪些访问器起作用?如果您觉得绝对需要保持控制,您可以编写类似于int*ptr=&v[0]的代码
和…ptr[i]…
,因为(从2003年起)向量内容存储保证是连续的。只要确保在向量大小增加时更改ptr
。@Poni:我们以前有过这个参数,所以它不是真的。看这里。()这里我们可以得出结论,向量和内置数组之间没有区别。作为一般规则(也是一个好习惯),您不应该在函数调用中动态分配对象(也就是说,您永远不应该在函数的参数中调用new
)。原因是函数参数的求值顺序未指定,因此最终可能会动态分配内存,然后另一个参数的求值可能会引发异常,然后动态分配的对象将泄漏+尽管这有点神秘,而且只适用于豆荚。詹姆斯·麦克内利斯,一般规则只是一般规则。他们有一个解释