std::set for array 中的每个元素
std::set for each element in an array
我需要数组中每个元素的std::set
功能。如何实现此功能?
我从分配 C++ 中设置的 std 动态数组开始,如下所示:
set<int>* entry;
其次是分配:
entry = (set<int>*)malloc(sizeof(set<int>)*32);
没有编译问题,但是当访问任何元素时,运行时会失败并出现分段错误:
entry[0].insert(23);
任何帮助都非常感谢。
怎么样
#include <set>
#include <vector>
int main()
{
std::vector < std::set<int> > entry(32); // std::vector constructor makes 32 calls to std::set<int> constructor
entry[0].insert(23);
// std::vector destructor makes 32 calls to std::set<int> destructor
}
在 c++ 中,您可以使用 new
分配内存。这里与 malloc 的区别在于调用构造函数来初始化内存。
entry = new set<int>[32];
即使您
已经为 32 个std::set
分配了存储空间,您也没有启动此内存跨度(即尚未调用std::set
的构造函数),因此您尝试在entry[0].insert (23)
中操作/访问的内存将导致未定义的行为。
将C++对象与malloc
混合在一起,并且它是等效的通常是(我很想写"总是")被认为是不好的做法。
相反,转向operator new
它将以适当的方式分配内存并处理对象的构造,还要记住delete
分配的内存以将内存释放回系统(并使对象以真实方式破坏)。
C++中做到这一点的正确方法
有些答案会包含文本,说你最好使用std::vector<std::set>
,尽管这并不是你问题的真正答案,所以我会给你这个例子片段
int
main (int argc, char *argv[])
{
std::set<int> *entries = new std::set<int> [32];
entries[0].insert (123);
delete [] entries;
}
这是一个很好的问题,其答案并不明显。 麻烦的是每个set
对象都希望在使用之前进行初始化,而您的代码只为每个set
分配原始内存。 这可以修复它:
#include <vector>
#include <set>
using std::vector;
using std::set;
const int N = 32;
int main() {
vector< set<int> > entry(N);
entry[0].insert(23);
return 0;
}
不要尝试在 c++ 类中使用 malloc/calloc/realloc 等。使用新的。
相关文章:
- 如何读/写或遍历 std::array 中的特定元素范围?
- 通过作为指向 C++ 函数的指针传递来访问 std::array 元素的正确方法是什么?
- std::初始值设定项列表来自现有的 std::array,而不枚举每个元素
- 如何有条件地将元素添加到 std::array - C++11
- 用一个额外的元素扩展 std::array 的每个 std::元组
- 创建 2D 数组类:如何访问 2D 数组类(如 array[x][y))中的元素
- 使用声明中的元素类型隐式初始化 std::array
- 访问双 std::array 的元素
- 键入 trait 以获取 std::array 或 C 样式数组的元素类型
- 在 C++ 中访问 std::array<std::array> 元素
- std::array :通过智能指针访问元素的成员
- C++17 有效地将参数包参数与 std::array 元素相乘
- 如何为所有“ std :: array”的工厂结构进行部分专业化,该结构超过4`元素
- 2D-Array 会在存储新元素时删除元素本身
- 使用默认成员初始值设定项对 std::array 的元素进行零初始化
- 如何知道您输入到std::array中的最后一个元素是什么?
- 不能直接分配元素 std::array,它说没有运算符"="匹配
- 向量是否比std::array多使用一个解引用来访问元素
- std::set for array 中的每个元素
- 无法访问c++中Array的元素