什么是「;“最佳”;初始化C++;矢量? 我的问题是这里的C++纯粹主义者。我知道Bjarne Stroustrop希望我们养成使用C++向量的习惯:

什么是「;“最佳”;初始化C++;矢量? 我的问题是这里的C++纯粹主义者。我知道Bjarne Stroustrop希望我们养成使用C++向量的习惯:,c++,arrays,vector,C++,Arrays,Vector,对于C样式阵列,您需要执行以下操作: int arr[] = {69, 2, 3}; 什么是初始化C++向量的等效方法?也就是说,当你在C++中编程,需要一个动态的、随机访问的容器,并且你已经知道了其中需要的一些元素时,初始化那个吸盘的最佳方法是什么?p> 显然你能做到 int myints[] = {16,2,77,29}; std::vector<int> fifth (myints, myints + sizeof(myints) / sizeof(int) ) int m

对于C样式阵列,您需要执行以下操作:

int arr[] = {69, 2, 3};
<>什么是初始化C++向量的等效方法?也就是说,当你在C++中编程,需要一个动态的、随机访问的容器,并且你已经知道了其中需要的一些元素时,初始化那个吸盘的最佳方法是什么?p> 显然你能做到

int myints[] = {16,2,77,29};
std::vector<int> fifth (myints, myints + sizeof(myints) / sizeof(int) )
int myints[]={16,2,77,29};
向量第五(myints,myints+sizeof(myints)/sizeof(int))
但这不是很优雅….

C++11语法:

vector<int> arr = {69, 2, 3};
向量arr={69,2,3}; 就这些

花括号初始化器生成一个
std::initializer\u list
,然后将其传递给
std::vector
构造函数。

C++11语法:

vector<int> arr = {69, 2, 3};
std::vector v{ 1, 2, 3, 4};
向量arr={69,2,3}; 就这些


花括号初始化器生成一个
std::initializer\u list
,然后将其传递给
std::vector
构造函数。

如果您要的是C++03,则使用vector的迭代构造函数(就像您所做的那样);也许可以通过将数组长度移动到标头(宏)中使其“看起来”更优雅

std::vector v{ 1, 2, 3, 4};

然而,就效率而言,我不明白为什么一个会比另一个好。

如果您要的是C++03,那么使用vector的迭代构造函数(就像您所做的那样);也许可以通过将数组长度移动到标头(宏)中使其“看起来”更优雅


然而,就效率而言,我不明白为什么其中一个会比另一个好。

你对C++11满意吗?如果是,则do
std::vector v={1,2,3,4}:)从C++11开始,与数组相同。否则,创建您自己的
std::begin
std::end
版本。您对C++11满意吗?如果是,则do
std::vector v={1,2,3,4}:)从C++11开始,与数组相同。否则,创建自己版本的
std::begin
std::end
@Cheers和hth:这是更好还是更糟<码>向量arr{69,2,3}@DavidO:定义“更好”,你就有了答案。但是,如果可能的话,我更喜欢
=
。我必须检查
arr{69,2}
是否生成了一个2项向量,或者调用了生成69项的重复构造函数;幸运的是,它创建了一个2项向量…@DavidO如果所讨论的构造函数是显式的,那么它是必需的。否则这是一个偏好的问题。@Cheers和hth:这是更好还是更糟<码>向量arr{69,2,3}@DavidO:定义“更好”,你就有了答案。但是,如果可能的话,我更喜欢
=
。我必须检查
arr{69,2}
是否生成了一个2项向量,或者调用了生成69项的重复构造函数;幸运的是,它创建了一个2项向量…@DavidO如果所讨论的构造函数是显式的,那么它是必需的。否则这是一个偏好的问题。@Koushik:只有当你被允许使用C++11时,第一部分才能在纯C++03中工作
array\u len
返回编译时数组的大小。宏最好使用大写。值得注意的是,在C++03(它的本意)中,它不适用于本地类型的数组。然而,我们通常并不介意。这种方法的好处在于它产生了一个编译时常量,可以用来指定另一个数组的大小。@legends2k:因为在C++03中,模板不能在本地类型上实例化。我记得是因为他们没有联系。然而,在c++11中仍然没有链接(据我所知),但允许模板实例化。不过,我必须查看详细信息以确定原因。在我们进行此操作时,sizeof(a)/sizeof(*a)东西也可以生成编译时常量并包装在宏中,但仅限于运行时(动态)类型检查。。。所以大部分都是劣质的。在c++03中,仅作为局部类型数组的替代方案相关。@legends2k:oh。问题是当
a
无意中是指针时。运行时检查可以通过取消引用并获取地址来完成,使用
typeid
检查您是否仍然具有相同的类型,将其放入
断言中,然后再次放入逗号表达式中。非常尴尬!但是也许总比什么都没有好。@Koushik:只有当你被允许使用C++11时,第一部分才能在纯C++03中工作
array\u len
返回编译时数组的大小。宏最好使用大写。值得注意的是,在C++03(它的本意)中,它不适用于本地类型的数组。然而,我们通常并不介意。这种方法的好处在于它产生了一个编译时常量,可以用来指定另一个数组的大小。@legends2k:因为在C++03中,模板不能在本地类型上实例化。我记得是因为他们没有联系。然而,在c++11中仍然没有链接(据我所知),但允许模板实例化。不过,我必须查看详细信息以确定原因。在我们进行此操作时,sizeof(a)/sizeof(*a)东西也可以生成编译时常量并包装在宏中,但仅限于运行时(动态)类型检查。。。所以大部分都是劣质的。在c++03中,仅作为局部类型数组的替代方案相关。@legends2k:oh。问题是当
a
无意中是指针时。运行时检查可以通过取消引用并获取地址来完成,使用
typeid
检查您是否仍然具有相同的类型,将其放入
断言中,然后再次放入逗号表达式中。非常尴尬!但也许总比什么都没有好。