Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ std::为数组中的每个元素设置_C++_Arrays_Memory Management_Vector_Set - Fatal编程技术网

C++ std::为数组中的每个元素设置

C++ std::为数组中的每个元素设置,c++,arrays,memory-management,vector,set,C++,Arrays,Memory Management,Vector,Set,我需要为数组中的每个元素提供std::set功能。如何实现此功能 我开始在C++中分配STD集的动态数组如下: set<int>* entry; P>任何帮助都是非常值得赞赏的。在C++中, < P>你用“新< /Cord>”分配内存。这里与malloc的区别在于调用构造函数来初始化内存 entry = new set<int>[32]; entry=新集合[32]; 那怎么办 #include <set> #include <vector>

我需要为数组中的每个元素提供
std::set
功能。如何实现此功能

我开始在C++中分配STD集的动态数组如下:

set<int>* entry;

<> P>任何帮助都是非常值得赞赏的。在C++中,

< P>你用“<代码>新< /Cord>”分配内存。这里与malloc的区别在于调用构造函数来初始化内存

entry = new set<int>[32];
entry=新集合[32];
那怎么办

#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
}
#包括
#包括
int main()
{
std::vectorentry(32);//std::vector构造函数对std::set构造函数进行32次调用
条目[0]。插入(23);
//std::vector析构函数对std::set析构函数进行32次调用
}

<>代码>不要尝试使用C++类使用MalC/CaloC/ReLoC等。使用new.

即使您已为32个
std::set
分配了存储空间,但尚未初始化此内存范围(即尚未调用
std::set
的构造函数),因此您尝试在
条目[0]中操作/访问的内存。插入(23)
将导致

将C++对象与 MalOC/混合,它的等价物通常(我想写“永远”)被认为是不好的实践。

相反,请转到
operator new
,它将分配内存并以适当的方式处理对象的构造,还请记住
delete
分配的内存以将内存释放回系统(并使对象以真实的方式销毁)


C++中正确的实现方法 一些答案会包含一些文字,说明您最好使用
std::vector
,尽管这并不是您问题的真正答案,所以我将给您留下这个示例片段

int
main(int argc,char*argv[])
{
std::set*条目=新std::set[32];
条目[0]。插入(123);
删除[]项;
}

这是一个很好的问题,它的答案不是很明显。问题在于,每个
集合
对象都希望在使用之前进行初始化,而您的代码只为每个
集合
分配原始内存。这就解决了这个问题:

#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;
}
#包括
#包括
使用std::vector;
使用std::set;
常数int N=32;
int main(){
向量条目(N);
条目[0]。插入(23);
返回0;
}

您还没有创建
集本身。为什么不创建:std::vector entries?但不要忘记在完成后删除它。通常,最好使用像
std::vector
这样的容器为您管理内存。
std::vector
确实是这个问题的答案。如果
insert
引发异常,则您的示例存在内存泄漏;对于这种泄漏,最简单的修复方法是使用RAII包装器管理阵列;这样一个动态数组的包装器已经实现并被称为
std::vector
@MikeSeymour这是一个超出问题范围的答案,因此我选择不在我的帖子中包含它。MikeSeymour是正确的。这不再是C++中的好实践。code>std::array
是固定大小数组的另一个选项。
#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
}
int
main (int argc, char *argv[])
{
  std::set<int> *entries = new std::set<int> [32]; 

  entries[0].insert (123);

  delete [] entries;
}
#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;
}