c++向量有效地添加元素
C++ vector adding elements efficiently
假设我有以下代码:
#include <iostream>
#include <vector>
using namespace std;
class X {
public:
int x[1000];
X(int y) { for (int i = 0; i < 1000; i++) x[i] = y; }
};
int main() {
vector<X> v;
X x0(0);
X x1(1);
X x2(2);
v.push_back(x0);
v.push_back(x1);
v.push_back(x2);
cout << v[2].x[33] << endl;
return 0;
}
如果我理解正确,在我的代码中,我在堆栈上为x0
, x1
和x2
分配内存,然后将这些内容复制到由vector
分配给我的内存中。此外,据我所知,移动语义在这里没有帮助,因为它不完全像X
持有指向位于其他地方的资源的指针。
我是否可以直接调用vector
分配给我的原始内存块上的构造函数?如果没有,处理这种情况的正确方法是什么?
您需要使用c++ 11的emplace_back
.
同样,如果你担心多余的拷贝/移动,尝试从v.reserve(3)
开始。
如果可用,也可以使用std::ref
或boost::ref
,并在vector中存储对象的引用,从而避免复制。
#include <iostream>
#include <vector>
#include <functional>
using namespace std;
class X {
public:
int x[1000];
X(int y) { for (int i = 0; i < 1000; i++) x[i] = y; }
};
int main() {
std::vector<std::reference_wrapper<X> > v;
X x0(0);
X x1(1);
X x2(2);
v.push_back(std::ref(x0));
v.push_back(std::ref(x1));
v.push_back(std::ref(x2));
cout << v[2].get().x[33] << endl;
return 0;
}
相关文章:
- 使用std::transform将一个范围的元素添加到另一个范围中
- 如何将元素添加到数组的线程安全函数?
- 如何将元素添加到向量的字符串位置
- 将数组的元素添加到链表中
- 如何在C++中将元素添加到非固定大小的数组中?
- 如何使用模板根据类型将元素添加到各种容器中
- 将在堆栈上声明的元素添加到静态数组
- 有什么方法可以将元素添加到列表中,如图所示?
- 继承层次结构并将元素添加到向量
- gStreamer 将元素添加到通过 gst_parse_launch 创建的管道中
- 将新元素添加到列表中,并返回对该元素的引用?
- 将元素添加到 std::list 在多线程中,无需 C++ 互斥锁
- C++如何通过超出大小将元素添加到指针数组中
- 将集合的随机元素添加到列表中,然后将其从原始集合中移除
- 将字符串集合中的元素添加到字符串集合的向量中
- 为什么 memcpy() 是一种将元素添加到 'std::map' 的方法?
- 如何有条件地将元素添加到 std::array - C++11
- 如何在 c++ 中将元素添加到数组的最后一个
- 如何使用<<运算符将元素添加到向量?
- 将元素添加到结构向量的全球向量中