2

我对输入对象的 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(.) 通过引用获取值,当 mySet 包含“a”值时,插入的所有“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 类型)都应该被删除。我上面说的准确吗?

谢谢。

4

1 回答 1

3

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

于 2013-10-16T00:53:03.237 回答