为什么这样给Vector 赋值, size 不会增长

shuchao 2009-03-20 11:32:12
#include <iostream>
#include <string>
#include <vector>
using namespace std;

class test
{
public:
vector<int*> i;

test(void){
i.clear();
i.reserve(3);
}

void foo(int slotId, int *temp){
(this->i)[slotId] = temp;
}
};

int main(void)
{
test *t1 = new test();
int a = 0;
int b = 1;
int c = 2;
int d = 3;

t1->foo(0, &a);
t1->foo(1, &b);
t1->foo(2, &c);

//t1->i.push_back(&d); //add this, size will be 1
cout << "vector size is " << (t1->i).size() << endl; //size only = 0

for(int k = 0; k < 3; k++){
cout << "slot id is " << k << " int number is " << * ( (t1->i)[k] ) << endl;
}

/*
vector<int*>::iterator it = (t1->i).begin()
for(int k = 0; it != (t1->i).end(); it++, k++){
cout << "slot id is " << k << " int number is " << *(*it) << endl;
}*/


delete t1;
return 0;
}
...全文
388 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
f22fbi 2009-03-20
  • 打赏
  • 举报
回复
vector的下标不能自动增长
yangkunhenry 2009-03-20
  • 打赏
  • 举报
回复

cout<<t1->i.size()<<endl;//你看看你vector的大小,0!用push_back吧。
t1->foo(0, &a);
t1->foo(1, &b);
t1->foo(2, &c);
bbb332 2009-03-20
  • 打赏
  • 举报
回复
好像vector的下标不能自动增长,而且还有可能会越界....
  • 打赏
  • 举报
回复
没有push_back,如何增长?
arong1234 2009-03-20
  • 打赏
  • 举报
回复
只有你按照正确的方法使用类,结果才是对的。没有任何人告诉你vector可以这样加对象可以自动增加下标。[]只用于返回已经存在元素的下标,如果你试图访问不存在的元素,结果是不可预知的。看看MSDN的说明:


Return Value

If the position specified is greater than or equal to the size of the container, the result is undefined.

downmooner 2009-03-20
  • 打赏
  • 举报
回复
你的代码运行时不死掉才怪.

size一直是0.再去添加元素无意义了.
Qlaiaqu 2009-03-20
  • 打赏
  • 举报
回复
你这样搞是不行的
(this->i)[slotId] = temp;
一开始你根本没有给容器分配内存,你这么做完全是在访问未知内存区域
应该要使用push_back
wushichao1987 2009-03-20
  • 打赏
  • 举报
回复
vector的下标操作不添加元素,所以size是0;
至于说你的程序如果能运行的话,那么是侥幸,你可以把 i.reserve(3);中的3换个小数试试,或者在调用几次foo函数,肯定会运行出错.
eatsweetpotato 2009-03-20
  • 打赏
  • 举报
回复
好像只有map的下标操作符才有增加元素的功能
shuchao 2009-03-20
  • 打赏
  • 举报
回复
难道只有push_back 或是 insert 才能使vector的size 增长么?
shuchao 2009-03-20
  • 打赏
  • 举报
回复
我的问题现在是,如何看待reserve出来的成员,reserve出来的值只能看成是空间,不能看成是成员的索引是么?
一线coder 2009-03-20
  • 打赏
  • 举报
回复
必须是已经存在的元素才能用下标操作符进行索引,通过下标操作进行赋值时,不会添加任何元素。
一线coder 2009-03-20
  • 打赏
  • 举报
回复
如果容器里面本来没有元素的话,你是不可能通过赋值来增加元素的,赋值只能改变已有的元素而不能增加元素, 所以必须用push_back. push_back 方法才有增加vector的size的操作.
bushizhuge 2009-03-20
  • 打赏
  • 举报
回复
你用reserve只是设置了容量,而元素个数没有改变,此时没有元素,你再用下标操作是非法访问,你可以在构造函数中调用resize给vector分配元素.
pengzhixi 2009-03-20
  • 打赏
  • 举报
回复
如果容器里面本来没有元素的话,你是不可能通过赋值来增加元素的,赋值只能改变已有的元素而不能增加元素
Terark-CTO-雷鹏 2009-03-20
  • 打赏
  • 举报
回复
在某些编译环境下会出现assert fail,比如vc debug,gcc中貌似不会引发assert fail,但实际上已经出错了。reserve只是保留对象本身的存储空间,如果对象中有指向分配的对象指针,后果真的是 undefine,象你这样只保存int,出错的可能性会小一些,但仍是undefine。
diannaomingong 2009-03-20
  • 打赏
  • 举报
回复
我记得C++ primer里说得很清楚了不能直接这样赋值来增加下标
pengzhixi 2009-03-20
  • 打赏
  • 举报
回复
你都说了是赋值咯,想让size增大那就push_back();size是代表容器里面已经有多少个元素,而capital是代表这个容器的最多能容纳多少个元素。建议再去看看书。
shuchao 2009-03-20
  • 打赏
  • 举报
回复
感谢各位的回答,
关于这个vector内存分配的问题,我在一开始已经有reserve了,这应该相当于开辟了3个成员的内存空间吧。
其它的好像没什么问题了,只是感觉这样有点奇怪,似乎vector的size不是完全代表成员的数目,
或者你可以说是我没有按照正确的方法加入成员,但是看上去这个vector里面确实是有成员了,应该怎么看待这个问题呢?

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧