C++ vector::推回并访问C+中向量指针中的值+;

C++ vector::推回并访问C+中向量指针中的值+;,c++,pointers,vector,C++,Pointers,Vector,编辑:以下问题由回答。我有一个新的更新问题,它的使用效率是否更高:(我的朋友说,放置一个向量的向量是低效的,因为它使用顺序内存,而当你向后推时,realloc意味着需要更多的时间来找到整个大向量的内存块可以放置的位置) (其中图片是线的矢量,线是点的矢量) 此外,我还编写了一个迭代器来完成,但是它似乎不起作用,因此我认为上面的代码不起作用。最后,我最担心的是,虽然上面的代码可以工作,但它为我的输出提供了非常奇怪的值。7位数长的大数字,绝对不是我为s.c和s.d输入的值 for(std::vect

编辑:以下问题由回答。我有一个新的更新问题,它的使用效率是否更高:(我的朋友说,放置一个向量的向量是低效的,因为它使用顺序内存,而当你向后推时,realloc意味着需要更多的时间来找到整个大向量的内存块可以放置的位置)

(其中图片是线的矢量,线是点的矢量)

此外,我还编写了一个迭代器来完成,但是它似乎不起作用,因此我认为上面的代码不起作用。最后,我最担心的是,虽然上面的代码可以工作,但它为我的输出提供了非常奇怪的值。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;
}
for(std::vector::iterator it=Shapes->begin();itend();it++){
形状s=(*it);

std::cout至于您更新的问题,即使用指向向量的指针是否比使用向量本身更有效。在某些情况下,使用指向向量的指针比使用实际向量本身更有效。一个具体的示例是使用向量作为函数的参数

例:

void somefunction(std::vector hello)
在这种情况下,std::vector的复制构造函数会在调用此函数时被调用(该函数会完全复制向量,包括向量中包含的元素)。通过引用传递可以消除此额外副本


当使用指向向量的指针时,push_本身是否更有效。不,使用指针并不更有效(它们在时间上应该大致相当).

关于您更新的问题,即使用指向向量的指针是否比使用向量本身更有效。在某些情况下,使用指向向量的指针比使用实际向量本身更有效。一个具体的示例是使用向量作为函数的参数

例:

void somefunction(std::vector hello)
在这种情况下,std::vector的复制构造函数会在调用此函数时被调用(该函数会完全复制向量,包括向量中包含的元素)。通过引用传递可以消除此额外副本


当使用指向向量的指针时,push_本身是否更有效。不,使用指针并不更有效(它们在时间上应该大致相当).

使用指向向量的指针向量并不比向量向量更有效。它的效率较低,因为它引入了额外的间接级别。它也不会导致生成的二维数组的所有元素被连续分配

原因是向量实际上是指向数组的指针,从这个意义上讲,
向量
大致实现为

 template <typename T>
 class vector
 {
     T *p;  // pointer to array of elements
     size_t nelems, capacity;

   public:
     // interface
 };
模板
类向量
{
T*p;//指向元素数组的指针
尺寸、部件、容量;
公众:
//接口
};
因此,向量向量的行为就性能而言,就像指向数组的指针的动态数组


注:我不能引用C++标准的章节,但我确信它限制了<代码> STD::向量< /代码>的操作和复杂性,以上述方式是唯一可行的实现方法。

使用指向向量的指针向量并不比向量向量更有效。它的效率较低,因为它引入了额外的间接级别。它也不会导致生成的二维数组的所有元素都被连续分配

原因是向量实际上是指向数组的指针,从这个意义上讲,
向量
大致实现为

 template <typename T>
 class vector
 {
     T *p;  // pointer to array of elements
     size_t nelems, capacity;

   public:
     // interface
 };
模板
类向量
{
T*p;//指向元素数组的指针
尺寸、部件、容量;
公众:
//接口
};
因此,向量向量的行为就性能而言,就像指向数组的指针的动态数组


[P>(注:我不能引用C++标准章节),但我确信它限制了<代码> STD::向量< /代码>的操作和复杂性,上面提到的是实现它的唯一实用方法。

你的朋友是错的。对于连续数组,您引入了额外级别的间接寻址并浪费了更多的空间。到底是什么不起作用?编译器错误?运行时错误?是否在任何位置初始化intvec指针(使用新的std::vector())?@larsmans向量对象本身不是指针,但它内部包含指向缓冲区的指针,我知道你知道这一点,但仍然想把它说出来。谢谢@larsmans,只是想知道,你能回答这个问题吗,这样我就可以把你的答案标记为正确吗?你的朋友错了。
向量
对象本身就是指针(带有一些额外的成员)到一个连续数组,因此您引入了一个额外的间接级别并浪费了更多的空间。到底是什么不起作用?编译器错误?运行时错误?是否在任何地方初始化intvec指针(使用新的std::vector())?@larsmans向量对象本身不是指针,但它内部包含指向缓冲区的指针,我知道你知道这一点,但仍然想把它说出来。谢谢@larsmans,只是想知道,你能回答这个问题吗,这样我就可以标记你的答案是正确的?
for(std::vector<Shape>::iterator it=Shapes->begin();it<Shapes->end();it++){
    Shape s = (*it);
    std::cout << s.c << s.d << std::endl;
}
void somefunction(std::vector<int> hello)
 template <typename T>
 class vector
 {
     T *p;  // pointer to array of elements
     size_t nelems, capacity;

   public:
     // interface
 };