【问题标题】:std::set for each element in an array为数组中的每个元素设置 std::set
【发布时间】:2012-07-04 11:26:18
【问题描述】:

我需要为数组中的每个元素提供std::set 的功能。我怎样才能实现这个功能?

我首先在 C++ 中分配标准集的动态数组,如下所示:

set<int>* entry;

其次是分配:

entry = (set<int>*)malloc(sizeof(set<int>)*32);

没有编译问题,但是在访问任何元素时运行时会因分段错误而失败:

entry[0].insert(23);

非常感谢任何帮助。

【问题讨论】:

  • 您还没有创建set 本身。
  • 为什么不:std::vector<:set> > 条目; ?

标签: c++ arrays memory-management vector set


【解决方案1】:

怎么样

#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
}

【讨论】:

    【解决方案2】:

    在 c++ 中,您使用 new 分配内存。这里和 malloc 的区别是调用构造函数来初始化内存。

    entry = new set<int>[32];
    

    【讨论】:

    • 但不要忘记在完成后将其删除。通常,最好使用std::vector 之类的容器来为您管理内存。
    【解决方案3】:

    即使您已经为 32 个std::set 分配了存储空间,但您还没有初始化这个内存跨度(即尚未调用您的std::set 的构造函数),因此您尝试使用的内存操作/访问entry[0].insert (23) 将导致undefined behavior

    将 C++ 对象与 malloc 混合使用通常(我很想写“always”)被认为是不好的做法。

    而不是转向operator new,它将以适当的方式分配内存并处理对象的构造,还记得delete分配的内存将内存释放回您的系统(并使对象销毁以真实的方式)。


    在 C++ 中的正确方法

    有些答案会包含说明您最好使用std::vector&lt;std::set&gt; 的文字,尽管这并不是您问题的真正答案,所以我将给您留下这个示例 sn-p

    int
    main (int argc, char *argv[])
    {
      std::set<int> *entries = new std::set<int> [32]; 
    
      entries[0].insert (123);
    
      delete [] entries;
    }
    

    【讨论】:

    • std::vector 确实是这个问题的答案。如果insert 抛出异常,则您的示例存在内存泄漏;解决此类泄漏的最简单方法是使用 RAII 包装器管理阵列;并且已经实现了这样一个动态数组的包装器并称为std::vector
    • @MikeSeymour 这是一个超出问题范围的答案,因此我选择不将其包含在我的帖子中。
    • 迈克西摩是对的。这不再是 C++ 中的好习惯。 std::array 是固定大小数组的另一种选择。
    【解决方案4】:

    这是一个很好的问题,但它的答案并不是很明显。问题是每个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;
    }
    

    【讨论】:

      【解决方案5】:

      不要尝试在 c++ 类中使用 malloc/calloc/realloc 等。使用新的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-11-09
        • 2012-07-11
        • 1970-01-01
        • 1970-01-01
        • 2012-08-31
        • 1970-01-01
        • 2018-01-11
        • 2021-04-12
        相关资源
        最近更新 更多