【发布时间】: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()。