C++ 如何将C数组转换为std::initializer\u list?
我知道数组的指针及其大小。可以从中创建什么容器?我试着这样做:C++ 如何将C数组转换为std::initializer\u list?,c++,gcc,visual-c++,C++,Gcc,Visual C++,我知道数组的指针及其大小。可以从中创建什么容器?我试着这样做: std::initializer_list<int> foo(arr, arr + size); std::初始值设定项\列表foo(arr,arr+大小); 它适用于MSVC,但不适用于gcc如果您需要一个实际的数据拥有容器,那么您需要的是一个。这将花费你一份拷贝和一份分配。如果您所需要的只是像容器一样工作,那么您需要的是即将到来的C++20。它接受一个指针和一个大小,并将其包装在一个类似于数组的接口中 无国界医生
std::initializer_list<int> foo(arr, arr + size);
std::初始值设定项\列表foo(arr,arr+大小);
它适用于MSVC,但不适用于gcc如果您需要一个实际的数据拥有容器,那么您需要的是一个。这将花费你一份拷贝和一份分配。如果您所需要的只是像容器一样工作,那么您需要的是即将到来的C++20。它接受一个指针和一个大小,并将其包装在一个类似于数组的接口中 无国界医生使用
std::initializer_list<int> foo(arr, arr + size);
如果您需要一个实际的数据拥有容器,那么您需要的是一个。这将花费你一份拷贝和一份分配。如果您所需要的只是像容器一样工作,那么您需要的是即将到来的C++20。它接受一个指针和一个大小,并将其包装在一个类似于数组的接口中 无国界医生使用
std::initializer_list<int> foo(arr, arr + size);
是一种仅为支持列表初始化而设计的引用类型,并且只有默认的ctor和隐式复制ctor。任何其他ctor都是一个扩展
您可以直接从迭代器范围初始化目标容器,而不涉及任何中间视图
除非你更清楚,否则使用的标准容器是。或者使用像这样的简单视图就足够了吗?是一种仅为支持列表初始化而设计的引用类型,只有默认的ctor和隐式复制ctor。任何其他ctor都是一个扩展
您可以直接从迭代器范围初始化目标容器,而不涉及任何中间视图
除非你更清楚,否则使用的标准容器是。或者,使用一个简单的视图(比如)就足够了吗?这里有两个问题,每个问题都有自己的答案
如何将C数组转换为std::initializer\u list 你不能。这样做真的没有意义。实际上只用于初始化(顾名思义)对象。它基本上是由
{}
符号创建的,如下所示:
myObject obj = {0,1,2,3,4};
class foo {
foo(std::initializer_list list) {
//...
}
};
尝试创建一个std::initializer\u list
的实例在我能想到的任何其他意义上都不是很有用,特别是在C++14之后,因为它有一个constepr
构造函数
如果某个对象
foo
接受std::initializer\u列表
,如下所示:
myObject obj = {0,1,2,3,4};
class foo {
foo(std::initializer_list list) {
//...
}
};
您想知道如何在没有std::initializer\u list
的情况下创建此对象,那么答案就是添加另一个构造函数:
class foo {
// an actual array
foo(type arr[size]) {
//...
}
// as a pointer
foo(type arr*, size_t size) {
//...
}
};
如果您使用的是第三方库,或者您不控制的其他库,并且没有其他构造函数,那么很可能不打算以这种方式使用它。在这种情况下,我将咨询您的文档或供应商
可以从中创建什么容器 任何。它们中的大多数都有某种构造函数,它接受指向对象的指针(实际上,从技术上讲,它需要迭代器,但在这种上下文中指针的工作方式相同)或数组。它们的设计非常方便从C数组进行转换。你使用哪一种取决于你的情况 另外,(它没有被列为“序列容器”)被认为是一个可能的容器,可以从C数组以低成本创建。尽管如此,我个人不能为他们担保,因为我对即将到来的标准不太熟悉
最后一点注意:如果MSVC允许这样做,那么要么a)你可能在C++11中(尽管我也不能确认C++11中是否允许这样做,只是构造函数不是C++中的
constexpr
),要么b)这是MSVC中的一个编译器错误。这里有两个问题,每个问题都有自己的答案
如何将C数组转换为std::initializer\u list 你不能。这样做真的没有意义。实际上只用于初始化(顾名思义)对象。它基本上是由
{}
符号创建的,如下所示:
myObject obj = {0,1,2,3,4};
class foo {
foo(std::initializer_list list) {
//...
}
};
尝试创建一个std::initializer\u list
的实例在我能想到的任何其他意义上都不是很有用,特别是在C++14之后,因为它有一个constepr
构造函数
如果某个对象
foo
接受std::initializer\u列表
,如下所示:
myObject obj = {0,1,2,3,4};
class foo {
foo(std::initializer_list list) {
//...
}
};
您想知道如何在没有std::initializer\u list
的情况下创建此对象,那么答案就是添加另一个构造函数:
class foo {
// an actual array
foo(type arr[size]) {
//...
}
// as a pointer
foo(type arr*, size_t size) {
//...
}
};
如果您使用的是第三方库,或者您不控制的其他库,并且没有其他构造函数,那么很可能不打算以这种方式使用它。在这种情况下,我将咨询您的文档或供应商
可以从中创建什么容器 任何。它们中的大多数都有某种构造函数,它接受指向对象的指针(实际上,从技术上讲,它需要迭代器,但在这种上下文中指针的工作方式相同)或数组。它们的设计非常方便从C数组进行转换。你使用哪一种取决于你的情况 另外,(它没有被列为“序列容器”)被认为是一个可能的容器,可以从C数组以低成本创建。尽管如此,我个人不能为他们担保,因为我对即将到来的标准不太熟悉
最后一点注意:如果MSVC允许这样做,那么要么a)你可能在C++11中(尽管我也不能确认C++11中是否允许这样做,只是构造函数不是C++中的
constepr
),要么b)这是MSVC中的一个编译错误。初始化器列表构造函数非常简单:constepr Initializer\u list()无例外代码>。如果std::初始值设定项\u列出foo(arr,arr+大小)
在Visual Studio下工作,这是因为它们添加了扩展。初始值设定项\u list
设计用于带括号的时间列表,它不是一般的容器。您可以使用ve