我有这样一段 C++ 代码(请不要问为什么它看起来这么难看;)——你必须相信,因为代码的进一步部分它确实有意义:
IntSet temp;
SuperSet superSet;
for (uint i = 0; i < noItems; i++) {
temp.insert(i);
superSet.insert(temp);
temp.clear();
}
用于准备noItems
整数集( IntSet
,每个包含一个整数值)并将其插入到另一组( SuperSet
)。两个集合定义如下:
typedef unsigned int DataType;
typedef std::set<DataType> IntSet;
typedef std::set<IntSet> SuperSet;
对我来说,这段代码不应该按预期工作,因为就在插入 temp
之后至 superSet
我正在清除 temp
,我发现 insert
正在获取一个引用作为其参数:pair<iterator,bool> insert ( const value_type& x );
( http://www.cplusplus.com/reference/stl/set/insert/ )
因此,作为上面代码的结果,我应该得到一个 SuperSet
仅包含已清除的 IntSet
的。但“不幸的是”这段代码有效——所有IntSet
的充满了正确的值...所以我的问题是 - STL 集合中的插入方法在其主体中真正做了什么?它只是简单地复制通过引用传递给它的对象吗?该方法在传递对象类型或原始类型之间的行为有何区别?
感谢您的回答!
最佳答案
insert()
采用引用参数以避免在传递参数时进行复制。但它会在将项目存储在集合中时创建一个拷贝。这就是 clear()
可以在这种情况下工作的原因。此外,在这两种情况下都是如此,因此即使您正在“重用”temp
,superSet
关于c++ - STL 的 set 的 insert 方法是否复制传递对象的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10940816/