c++ - 从数组构造 std::set

标签 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]));
}

我认为答案可能归结为动态内存分配的想法,但我想听听一些对此的反馈。

编辑:我没有使用 C++11。

最佳答案

Alternatively, is there anything wrong with defining the following function?

有:不行。

您不能将可变长度的 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);
}

——但我同意 Zac 的观点:函数过于具体(或者,反过来说:不够通用)。已经有一个通用的集合构造方法,通过迭代器。所以正确的方法是使用 C++11 的 std::beginstd::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;
}

关于c++ - 从数组构造 std::set,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18494217/

相关文章:

c++ - 抑制从 cin 到 cout 的回声

C++检查带有零和空值的数组的长度

c++ - 命名空间中的静态变量

python - 沿给定轴将 numpy ndarray 与一维数组相乘

java - 地球绕太阳运行模拟对象数组无法正确打印java

c++ - 使用单个值初始化 std::vector - 重复或 push_back()?

c++ - GetDIBits() 因 PNG 压缩而失败

javascript - 如何使用本地存储中的详细信息成功登录 [JavaScript]

C++ 我想避免使用指针,而是使用 STL 和引用来维护小型数据缓存

c++ - STL:在海量数据中进行排序和搜索