第一章 容器
03-确保容器中的对象拷贝正确而高效
STL容器的工作方式是”copy in, copy out”(进去的是副本,出来的也是副本)。这意味着:
1.插入时: push_back() 、 insert() 等操作会把对象拷贝一份存进容器
2.访问时:从容器取出对象也是得到副本
3.内部操作时:排序、删除、反转等算法也会频繁拷贝或移动元素;
在C++11 后,”副本”可以是移动而非拷贝。
三个主要问题与解决方式
1、拷贝引起的性能问题
std::vector<std::string> v; std::string s(1000000, 'x'); v.push_back(s);
v.push_back(std::move(s));
v.emplace_back(1000000, 'x');
class MyClass { public: MyClass(MyClass&& other) noexcept; MyClass& operator=(MyClass&& other) noexcept; };
|
2、切片问题: 将派生嘞对象存入基类容器,派生部分会被切掉
class Widget { }; class SpecialWidget : public Widget { };
std::vector<std::unique_ptr<Widget>> widgets; widgets.emplace_back(std::make_unique<SpecialWidget>());
|
3、移动后的对象处于”有效但未指定状态”
std::vector<std::string> v; std::string s = "hello"; v.push_back(std::move(s));
std::cout << s;
|