Dav*_*all 2 c++ arrays stl set
为什么C++没有为我们提供一个以数组作为参数的构造函数?或者,定义以下功能有什么问题吗?
template <class T>
std::set<T> ArrayToSet(T array[]) {
return std::set<T>(array, array + sizeof(array) / sizeof(array[0]));
}
Run Code Online (Sandbox Code Playgroud)
我认为答案可能归结为动态内存分配的想法,但我想听听一些有关此问题的反馈.
编辑:我没有使用C++ 11.
或者,定义以下功能有什么问题吗?
有:它不起作用.
您不能将可变长度C样式数组传递给函数.T array[]参数列表中的语法是以下内容的同义词T* array:传递原始指针,而不是参数.
但是,您可以通过引用传递固定大小的数组(即T (&array)[5]工作).要使此工作适用于不同的数组长度,您需要使用非类型模板参数:
template <class T, std::size_t N>
std::set<T> ArrayToSet(T (&array)[N]) {
return std::set<T>(array, array + N);
}
Run Code Online (Sandbox Code Playgroud)
- 但我同意这与Zac:功能过于具体(或者反过来说:不够通用).通过迭代器已经有了一种通用的集合构造方法.所以正确的方法是使用C++ 11 std::begin和std::end工具,如果你不能使用C++ 11,那么正确的方法是自己编写:
template <typename T, std::size_t N>
T* begin(T (&array)[N]) {
return array;
}
template <typename T, std::size_t N>
T* end(T (&array)[N]) {
return array + N;
}
Run Code Online (Sandbox Code Playgroud)
为什么 C++ 不为我们提供一个以数组作为参数的构造函数?
为什么会这样?Astd::set不是数组,它已经有一个使用迭代器来初始化它的构造函数,因此无需为数组添加另一个构造函数。 std::vector是一个数组,甚至它没有接受数组的构造函数。
或者,定义以下函数有什么问题吗?
是和不是。这是不必要的,因为你可以直接写
MyType myArray[mySize];
std::set<MyType> mySet(myArray, myArray + sizeof(myArray) / sizeof(array[0]);
// or std::set<MyType> mySet(myArray, myArray + mySize);
// or std::set<MyType> mySet(std::begin(myArray), std::end(myArray)); c++11
Run Code Online (Sandbox Code Playgroud)
它确实不值得它本身的功能。
如果您确实想编写一个函数来帮助您,我会通过将std::begin和移植std::end到 C++03 来实现它。这些至少比专门创建std::set.
它看起来与康拉德在他的回答中发布的内容一模一样。
| 归档时间: |
|
| 查看次数: |
3354 次 |
| 最近记录: |