std::set for array 中的每个元素

std::set for each element in an array

本文关键字:元素 array set for std      更新时间:2023-10-16

我需要数组中每个元素的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 等。使用新的。