关于对C++ stl容器元素的要求,标准规定:元素类型必须为CopyConstructible,并且有一个CopyConstructible要求表。此外,通过各种书籍(Josuttis等),生成的副本应该与源文件“等效”。
我想我需要澄清一下。“等同于”到底是什么?此外,我对"CopyConstructible“和”深层/浅层复制“之间的关系也有点困惑。一般来说,拷贝构造函数要么是浅拷贝,要么是深拷贝。那么,哪个适用于"CopyConstructible",哪个不适用呢?
感谢您的评论!
发布于 2011-06-30 16:43:42
深拷贝或浅拷贝都可以。例如,shared_ptr总是执行浅层复制(使用一些额外的引用计数),您可以在容器中使用它们。它依赖于复制操作的语义。
等效意味着你的程序不应该依赖于它是与原件一起工作还是与副本一起工作。
发布于 2011-06-30 16:56:11
如果你把一些东西放入一个容器中,当你检索它时,你会得到与你放入的东西相等的东西。只要这对你的对象有意义,你就可以从容器中得到一些有用的东西。
这是浅拷贝还是深拷贝取决于您想要的对象类型的语义。你的对象可能是类似指针的,类似句柄的,也可能是类似容器的。它可能包含一些可变缓存数据,您可能选择在复制操作中复制这些数据,也可能不选择。
只要您的复制构造函数是可访问的,并且做了您需要它做的事情来保留您的对象类型的语义,那么您就满足了CopyConstructible要求。
发布于 2011-06-30 17:12:09
通常,在某些操作或算法期间,STL容器可能会在某个阶段复制您的元素,因此litmus测试是:
Element original(....); // construct this awesome object
original.this_and_that(); // do stuff to it until the value is perfect...
Element another(original);你能快乐地使用another original**?**而不是吗?
这实际上就是CopyConstructible需求所说的:您最好能够将其复制到另一个对象中,同时仍然对结果感到满意。这并不是一个苛刻的限制--您只需要仔细考虑并编写相应的复制构造函数即可。
但是,这一点很重要,因为像find()这样的一些操作可能会使用==来比较元素(对于其他容器,可能是'<'),所以如果复制的副作用是你不能有意义地比较元素,那么你的 containers等人可能会停止工作**--也要仔细考虑一下!(标准规定,对于容器,"==是一个等价关系“(23.1-5)。)
https://stackoverflow.com/questions/6532173
复制相似问题