编辑:this回答了以下问题。我有一个新的更新问题,使用它是否更有效:(我的朋友说放置向量的向量是低效的,因为它使用顺序内存并且当你push_back意味着需要更多时间来找到位置时重新分配可放置整个大型矢量的一大块内存)
(其中Picture是行的矢量,Line是点的矢量)
std::vector<Point> *LineVec;
std::vector<Line> PictureVec;
versus
std::vector<Point> LineVec;
std::vector<Line> PictureVec;
struct Point{
int x;
int y;
}
我正在尝试获取向量的向量,而我的朋友告诉我,放置向量的向量是低效的,因为它使用顺序内存,向量的向量将需要大量的空间。所以他建议的是使用指针向量的向量。因此内部向量看起来像这样。很明显,我对C ++很陌生,并且很欣赏任何见解。
struct Shape{
int c;
int d;
}
std::vector<Shape> *intvec;
当我想回到这个时,我该怎么做?像这样的东西?
Shape s;
s.c=1;
s.d=1;
intvec->push_back(s);
另外,我编写了一个迭代器来完成,但它似乎不起作用,因此我相信上面的代码不起作用。最后我关注的是,虽然上面的代码有效,但它为我的输出提供了非常奇怪的值。长数为7位的大数字,绝对不是我为s.c和s.d输入的值。
for(std::vector<Shape>::iterator it=Shapes->begin();it<Shapes->end();it++){
Shape s = (*it);
std::cout << s.c << s.d << std::endl;
}
答案 0 :(得分:1)
使用指向矢量的指针向量不比矢量矢量更有效。它效率较低,因为它引入了额外的间接级别。它也 not 导致生成的二维数组的所有元素被连续分配。
原因是向量实际上是指向数组的指针,在某种意义上,vector<T>
大致实现为
template <typename T>
class vector
{
T *p; // pointer to array of elements
size_t nelems, capacity;
public:
// interface
};
这样一个向量向量在性能方面表现得像指向数组的动态指针数组。
[注意:我不能引用C ++标准的章节和经文,但我很确定它以这样的方式约束std::vector
的操作和复杂性,以至于上面是实现的唯一实用方法它。]
答案 1 :(得分:0)
关于更新的问题,关于在向量本身上使用指向向量的指针是否更有效。在某些情况下,使用指向矢量的指针而不是实际矢量本身更有效。一个具体的例子是使用向量作为函数的参数。
EX:
void somefunction(std::vector<int> hello)
在这种情况下,每次调用此函数时都会调用std :: vector的复制构造函数(它完全复制向量,包含向量中包含的元素)。通过引用传递摆脱了这个额外的副本。
当使用指向向量的指针时,push_back本身是否更有效。没有它使用指针的效率更高(它们应该大致相当于时间)。