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