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