【问题标题】:vector::push_back and accessing values in Vector Pointer in C++vector::push_back 和访问 C++ 中向量指针中的值
【发布时间】:2012-02-03 17:30:14
【问题描述】:

编辑: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;
}

【问题讨论】:

  • 你的朋友错了。 vector 对象本身就是一个指向连续数组的指针(带有一些额外的成员),因此您引入了额外的间接级别并浪费了更多空间。
  • 究竟什么不起作用?编译器错误?运行时错误?您是否在任何地方初始化您的 intvec 指针(使用新的 std::vector())?
  • @larsmans 向量对象本身不是指针,但它在内部包含指向缓冲区的指针,我知道你知道但仍想将其溢出 xD
  • 谢谢@larsmans,只是想知道,你能回答这个问题,以便我可以将你的答案标记为正确吗?

标签: c++ pointers vector


【解决方案1】:

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

原因是向量实际上是一个指向数组的指针,在某种意义上,vector&lt;T&gt; 大致实现为

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

   public:
     // interface
 };

这样一个向量向量的行为,在性能方面,就像一个指向数组的动态数组。

[注意:我不能引用 C++ 标准章节,但我很确定它限制了std::vector 的操作和复杂性,以至于上面是实现它的唯一实用方法。 ]

【讨论】:

    【解决方案2】:

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

    前:

    void somefunction(std::vector<int> hello)
    

    在这种情况下,只要调用此函数,就会调用 std::vector 的复制构造函数(它会完全复制向量,包括向量中包含的元素)。通过引用传递消除了这个额外的副本。

    至于 push_back 本身在使用指向向量的指针时是否更高效。不,使用指针并不是更有效(它们在时间上应该大致相同)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-13
      • 2012-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多