gpt4 book ai didi

c++ - 如果输入对象超出范围,std::set insert 是否需要动态分配输入对象?

转载 作者:搜寻专家 更新时间:2023-10-31 01:47:17 24 4
gpt4 key购买 nike

我对输入对象的 std::set 类和范围有疑问。

请考虑代码:

#include <iostream>
#include <set>

using namespace std;

class K {
private:
int m_a;
...
public:
K(int temp) { m_a = temp; }
...
};

int main ()
{
set<K> mySet;

for(int i=0; i<10;i++)
{
K a(rand());
mySet.insert(a);
}

return 0;
}

这段代码可以吗?由于 std::set.insert(.) 通过引用获取值,插入的所有“a”值是否都需要在范围内,而 mySet 包含“a”值?在这种情况下,有 10 个具有不同 m_a 值的“a”实例。

在这种情况下,在 for 循环的每次迭代中,当前的“a”都会超出范围。在这种情况下,正确的做法是动态分配“a”,如:

for(int i=0; i<10;i++)
{
K *a = new K(rand());
mySet.insert(*a);
}

当然,当 mySet 被销毁时,所有插入的“a”值(K 类型)都应该被删除。我上面说的准确吗?

谢谢。

最佳答案

std::set insert() 方法通过 const ref(至少它的一个版本)接受参数,但容器在内部复制参数。你的第一个例子没问题。实际上,甚至要求 std::set 中存储的类型具有可用的公共(public)复制构造函数(显式的,由您编写或隐式的,由编译器生成)

关于c++ - 如果输入对象超出范围,std::set insert 是否需要动态分配输入对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19393510/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com