- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我目前正在优化我的代码,我有一个关于 std::vector 的问题
我有一个 MyClass 类,我重写了复制/移动构造函数及其相应的运算符。
MyClass(const std::string& id, int x);
MyClass(const MyClass& other);
MyClass(MyClass&& other);
~MyClass();
MyClass& operator=(const MyClass& other);
MyClass& opratror*(MyClass&& other);
我创建了一个 vector 并尝试了以下操作
std::vector<MyClass> vec;
MyClass a("A", 1);
vec.push_back(a); //#1
vec.emplace_back("B", 2); //#2
vec.push_back(MyClass("C", 3)); //#3
在 #1 中,复制构造函数被调用(我知道 vector 按值存储,所以它复制了一个)在#2中它保存了一个复制构造函数调用只调用构造函数在 #3 中它调用构造函数并移动构造函数
但我发现,在 vector 不为空的 #2、#3 处,每次推回/emplace/emplace_back 都会触发现有项目的复制/销毁。
在 #2 中,它复制“A”并销毁现有的“A”在 #3 中,它对“A”和“B”做同样的事情
似乎只要数组发生变化, vector 就会重新计算所有项目。这是否意味着使用类 vector 会降低效率?这是使用 vector 存储指针的最佳解决方案,以便在求助期间没有复制/析构函数调用,只有指针复制吗?
谢谢
最佳答案
不是度假村,而是重新分配。根据契约(Contract), vector 需要连续存储其值,就像普通数组一样。保证连续存储的唯一方法是分配一 block 内存。一旦你得到它,你就完成了。你不能让它变大。您所能做的就是分配一个更大的 block 并复制所有内容,然后删除旧的较小的内存块。这就是您所看到的。
vector 通常会保留一些额外的额外空间,以容纳可能添加的新元素(这样这种复制不会在每次 push_back 时发生),但是当 vector 较小时,最初只有一点点额外空间为 future 的增长保留,这种重新分配仍然经常发生。但是随着 vector 大小的增长,越来越多的额外空间被保留,并且重新分配发生的频率越来越低。
如果您事先知道您要向 push_back
() 分配多少值,则可以预先使用 reserve()
预先分配额外的空间,并且最小化重新分配。
如果您知道要向 vector 中再添加十个值:
vec.reserve(vec.size()+10);
如果 vector 已经有至少十个以上的值可以接受而无需重新分配,那么这什么都不做。否则, vector 将重新分配足够的额外空间以容纳至少十个附加值。接下来的十次 push_back 保证不会导致重新分配。
关于C++ 11 std::vector push_back 方法多次调用 copy/dest?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53927034/
这个问题在这里已经有了答案: Passing by value vs const & and && overloads (3 个答案) 关闭 8 年前。 为什么push_back的函数签名如下? v
代码如下: std::vector s; s.push_back(~Dword(0)); 什么是~Dword?它是如何工作的? 最佳答案 Dword 这里是一个数字类型(可能是 DWORD 的类型别名
我正在测试 C++ 中推回对象与推回对象指针到 Vector 之间的性能差异。 我在 Stackoverflow 和其他文章中读到,您应该避免向后推指针,除非您必须这样做... 但是,我意识到推回指针
关闭。这个问题是not reproducible or was caused by typos .它目前不接受答案。 这个问题是由于错别字或无法再重现的问题引起的。虽然类似的问题可能是on-topi
我有一个很大的 .txt 文件,需要加载并存储在 vector 中。该文件大小约为 5MB,500 000 行,每行约 10-20 个字符,以 '\n' 分隔。我正在使用以下示例代码对读取整个文件所需
这个问题在这里已经有了答案: What is object slicing? (18 个答案) 关闭 9 年前。 我有这两个类: class A { public: A(); vir
在我当前的代码中,我想将新的 DrawObjects 插入到我创建的 vector 中, std::vector 对象; 有什么区别: objects.push_back(DrawObject(nam
我将 Cygwin 与 GCC 一起使用,最终我想将字 rune 件读入字符 vector ,并使用此代码 #include #include #include using namespace
以下代码创建一个临时对象 A 并将其推送到一个 vector 中。 在 push_back 期间删除复制构造函数并调用移动构造函数。我不确定这段代码的设计是否正确,肯定存在内存泄漏。 #include
我知道push_back可以抛出bad_alloc异常,并且如果没有try catch block ,则调用析构函数是不正确的。如果有任何push_back抛出并且它不在try catch block
正如 Scott Meyers 所指出的(http://channel9.msdn.com/Events/GoingNative/2013/An-Effective-Cpp11-14-Sampler
我正在写一个 push_back将临时容器添加到另一个容器的函数。 并且它应该在使用 push_back 之前调整或保留容器(如果两者都可用,它应该更喜欢保留而不是调整大小) 当前代码是: names
这个问题在这里已经有了答案: Create an array when the size is a variable not a constant (2 个答案) 关闭 3 年前。 我认为我在代码中
代码: // test2.cpp #include #include struct test_class { test_class() = default; test_class(
我试图在 forloop 的 vector 中推回一个 const char*。 char_temp 是一个名为 segment 的结构,而 chars_temp 是一个结构 vector 。请参阅下
在 C++ 入门书第 (3) 章中,有以下 for 循环将 vector 中的元素重置为零。 vector ivec; //UPDATE: vector declaration for (vector
class A { public: A():a(0) {} A(int x):a(x) { coutve
我正在尝试使用 Visual Leak Detector 查找内存泄漏。它告诉我 m_neighbors.push_back(ent);导致泄漏。 (简短调用堆栈 = NeighborCalculat
我们正在制作一个包含棋盘游戏信息(名称、年份、分数)的列表。我们从 .csv 文件中扫描信息,根据该信息创建一个结构,然后将该结构添加到列表中。我们一直这样做,直到文档阅读完毕。问题是列表的 push
以下代码是将“非重叠”的 TablePath 从 vector v 移动到 vector u。我在“u.push_back(*it1);”行遇到段错误。我没有复制对象(而是只复制对象的指针)所以我相信
我是一名优秀的程序员,十分优秀!