c++ - STL 的 set 的 insert 方法是否复制传递对象的值?

标签 c++ stl insert set

我有这样一段 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() 可以在这种情况下工作的原因。此外,在这两种情况下都是如此,因此即使您正在“重用”tempsuperSet

中也会有单独的拷贝

关于c++ - STL 的 set 的 insert 方法是否复制传递对象的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10940816/

相关文章:

c++ 数字的 m 位排列

c++ - 使用 "X11/Xutil.h"库读取像素时发生内存泄漏(使用 valgrind 输出)

c++ - CheckListBox 将焦点设置到特定索引

c++ - 如何从 STL 容器实例中获取元素类型?

c++ - 用列表中的每个元素调用 C++ 成员函数?

c++ - c++ 中的 pair class STL 有什么用,它像数据类型还是容器?

C++ - 派生类是否继承基类的静态成员?

javascript - tinymce 无法在工具栏上显示图标 "Insertfile"

python-3.x - Python pandas DataFrame 列插入调用

php - 如何在PHP的sqlite中插入新行?