【问题标题】:c++ vector.size() doesn't update if assigned through pointer如果通过指针分配,c ++ vector.size()不会更新
【发布时间】:2014-09-25 04:33:26
【问题描述】:

只是想知道,当使用指针更新向量时,有什么方法可以更新 size() 吗?考虑以下代码

std::vector<int> test;
test.reserve(5);
int* pt = test.data();
for (int i = 0; i < 5; ++i) {
    pt[i] = i;
}
for (int i = 0; i < 5; ++i) {
    printf("%d ? %d\n", pt[i], test[i]);
}
printf("Size:%zu Capacity:%zu Empty:%u\n", test.size(), test.capacity(), test.empty());
for (auto i : test) {
    printf("Nothing:%d\n", i);
}
printf("END\n");

数字 {0,1,2,3,4} 分配给指针 (pt),向量 (test) 占用这些值。 输出是

0 ? 0
1 ? 1
2 ? 2
3 ? 3
4 ? 4
Size:0 Capacity:5 Empty:1
END

大小保持为 0 并且 for 循环不产生任何结果。 我知道有一些简单的方法可以解决这个问题,比如使用 [] 或 push_back() 分配给实际向量。
但是,只是想知道,有没有办法获取/更新正确的 size()?

编辑

也许人们指出使用resize(),这只是做我想做的事(对不起,我在原帖中不清楚)。 考虑以下

std::vector<int> test;
test.resize(10);
int* pt = test.data();
int unknown_size = 5;  //This can be any unknown number which is < 10)?
                      //Long story short, save other space for later.
for (int i = 0; i < unknown_size; ++i) { 
    pt[i] = i;
}
for (int i = 0; i < 5; ++i) {
    printf("%d ? %d\n", pt[i], test[i]);
}
printf("Size:%zu Capacity:%zu Empty:%u\n", test.size(), test.capacity(), test.empty());

现在我们得到Size:10。但我们只使用了5/unknown_size 元素。有没有办法得到.size() == 5?? 是的,我意识到如果我使用push_back(),那么它可以解决所有问题。但是有没有办法用指针来做呢?

【问题讨论】:

  • resize(5),不是reserve(5)
  • 您正在调用未定义的行为.reserve() 确保在完成调整大小时(无论出于何种原因),空间都可用于保留。没有进行这样的调整大小。您正在访问您在技术上尚未拥有的内存。
  • 不,您通过越界访问pt 来引发未定义的行为。
  • resize() 部分问题仍然存在;如果我从test.resize(10)开始;那么size() 将始终为 10,无论我分配多少。那么,可以从test.resize(10) 开始吗?然后分配5个元素,得到size() == 5?
  • @Steven:不,不是。 resize() 会将大小设置为 10。您所希望的 bahvior 将在向量上使用 push_back()

标签: c++ c++11 vector


【解决方案1】:

您的程序有未定义的行为:使用resize() 更改向量的大小。 reserve() 只改变容量

【讨论】:

    【解决方案2】:

    你应该使用调整大小而不是保留。

    【讨论】:

      【解决方案3】:

      我想您为了发布问题而简化了这段代码。

      请考虑 vector.resize() 在它必须创建的元素(请求 - 现有)上调用(默认)构造函数的事实。如果从头开始,您将有 n 个 Ctor 调用。如果成本是可以接受的,那就去吧。否则,最好将reserve() + push_back() 结合起来。而且,您也会得到您的确切尺寸。

      【讨论】:

        【解决方案4】:

        在代码的开头使用reserve() 为您合理预期的任意数量的项目分配内存。

        如果您按照示例中的顺序添加元素,请使用push_back() 将项目添加到向量中。这将在末尾添加一项并更新所有尺寸。而且,如果您最终添加的项目多于您保留的项目,它会自动扩展向量。

        另一种方法是在开始时调用 resize(),然后在最后再次调用 resize() 以缩小矢量大小。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-04-19
          • 1970-01-01
          • 2010-12-16
          • 1970-01-01
          相关资源
          最近更新 更多