C++ c++;vector.size()不';如果通过指针分配,则不更新

C++ c++;vector.size()不';如果通过指针分配,则不更新,c++,c++11,vector,C++,C++11,Vector,只是想知道,当使用指针更新向量时,有没有办法更新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

只是想知道,当使用指针更新向量时,有没有办法更新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,for循环不产生任何结果。 我知道有很简单的方法可以解决这个问题,比如使用[]或push_back()指定实际向量。
但是,我只是想知道,是否仍然可以获取/更新正确的大小()

编辑 也许有人指出使用
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());
std::向量测试;
测试。调整大小(10);
int*pt=test.data();
int未知_大小=5//这可以是<10)的任何未知数字?
//长话短说,为以后节省其他空间。
对于(int i=0;i
现在我们得到了
尺寸:10
。但是我们只使用了
5/未知大小的
元素。有没有办法得到
.size()==5
??
是的,我意识到如果我使用
push_back()
,那么它就解决了所有问题。但是,还有其他方法可以使用指针吗?

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

您应该使用resize而不是reserve。

我想您简化此代码是为了发布问题


请考虑vector.resize()调用它必须创建的元素(request-existing)上的(默认)构造函数这一事实。如果从头开始,您将有n个Ctor调用。如果费用可以接受的话,一定要去做。否则,您最好将reserve()与push_back()结合使用。而且,您也将获得确切的大小。

在代码开始时,使用
reserve()
为您合理期望的任意多个项目分配内存

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


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

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