关于vector元素引用以及swap()。。。

kiffa 2009-03-07 07:49:57
以下代码输出结果是什么,为什么:


int main()
{
vector<int> ivec(3,1);
int &i = ivec[2];

vector<int> ivec2(3,2);

ivec.swap(ivec2);
cout << i << endl;
}
...全文
847 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
i_linux 2009-09-09
  • 打赏
  • 举报
回复
to 11楼,i = 5; //i的地址已经失效了,导致无意义的修改,i引用的地址已经被容器delete啦
i的地址并没有失效,对i赋值也是可以的,i的地址一直都没有变化,但是容器中已经没有这个了……
tangshuiling 2009-03-07
  • 打赏
  • 举报
回复

笔误修正:
ivec.reserve(10); //这条语句会导致内存的重新分配
tangshuiling 2009-03-07
  • 打赏
  • 举报
回复

给楼主的代码添点东西,看了后自然明白引用为何失效!
int main()
{
vector <int> ivec(3,1);
ivec.reserve(10); //这条语句不会导致内存的重新分配

vector <int> ivec2(3,2);
ivec.swap(ivec2);

int &i = ivec[2];
cout<<&i<<endl;
cout<<(void*)&ivec[2]<<endl; //此时引用还是和ivec[2]的内存地址一致
ivec.push_back(2); // 有内存的分配动作,引用失效
i = 5; //i的地址已经失效了,导致无意义的修改,i引用的地址已经被容器delete啦
cout << (void*)&ivec[2] << endl; //这里能看到地址已经跟前面的ivec[2]不一致了
cout<<ivec[2]<<endl;
}
hacker_sx 2009-03-07
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 kiffa 的回复:]
啊,我3L的代码写错了,应该是这样:
int main()
{
vector <int> ivec(3,1);
ivec.reserve(10);

vector <int> ivec2(3,2);
ivec.swap(ivec2);

int &i = ivec[2];
ivec.push_back(2);
i = 5;
cout < < ivec[2] < < endl;
}
[/Quote]
开始引用指向ivec[2],但是swap之后,它指向ivec2[2]
但是你能说它失效吗,不能,因为经过swap之后,ivec[2]和ivec2[2]里面的内容是一样的.
而且能保证这两个值是每次swap之后都是一样的,所以何以说引用失效了.能保证在做了某种操作之后
引用指向的还是原来的内容,引用就不失效的.不能保证的话就是失效的,而swap可以保证
hacker_sx 2009-03-07
  • 打赏
  • 举报
回复
[Quote=引用楼主 kiffa 的帖子:]
以下代码输出结果是什么,为什么:


C/C++ code
int main()
{
vector<int> ivec(3,1);
int &i = ivec[2];

vector<int> ivec2(3,2);

ivec.swap(ivec2);
cout << i << endl;
}
[/Quote]
swap函数,该操作不会删除或插入元素,也没移动元素,所以引用不会失效
zhkefa 2009-03-07
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 kiffa 的回复:]
引用 6 楼 zhkefa 的回复:
引用 5 楼 kiffa 的回复:
啊,我3L的代码写错了,应该是这样:
int main()
{
vector <int> ivec(3,1);
ivec.reserve(10);

vector <int> ivec2(3,2);
ivec.swap(ivec2);

int &i = ivec[2];
ivec.push_back(2); //可能会造成ivec上的引用失效
i = 5;
cout < < ivec[2] < < endl;
}


现在变回你发的上一个贴问题了。




但是我前面有个ivec.reserve(1…
[/Quote]

。。。
你swap了啊。
kiffa 2009-03-07
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 zhkefa 的回复:]
引用 5 楼 kiffa 的回复:
啊,我3L的代码写错了,应该是这样:
int main()
{
vector <int> ivec(3,1);
ivec.reserve(10);

vector <int> ivec2(3,2);
ivec.swap(ivec2);

int &i = ivec[2];
ivec.push_back(2);  //可能会造成ivec上的引用失效
i = 5;
cout < < ivec[2] < < endl;
}


现在变回你发的上一个贴问题了。


[/Quote]

但是我前面有个ivec.reserve(10);预留了空间啊。
zhkefa 2009-03-07
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 kiffa 的回复:]
啊,我3L的代码写错了,应该是这样:
int main()
{
vector <int> ivec(3,1);
ivec.reserve(10);

vector <int> ivec2(3,2);
ivec.swap(ivec2);

int &i = ivec[2];
ivec.push_back(2); //可能会造成ivec上的引用失效
i = 5;
cout < < ivec[2] < < endl;
}
[/Quote]

现在变回你发的上一个贴问题了。

kiffa 2009-03-07
  • 打赏
  • 举报
回复
啊,我3L的代码写错了,应该是这样:
int main()
{
vector<int> ivec(3,1);
ivec.reserve(10);

vector<int> ivec2(3,2);
ivec.swap(ivec2);

int &i = ivec[2];
ivec.push_back(2);
i = 5;
cout << ivec[2] << endl;
}
  • 打赏
  • 举报
回复
输出2

swap后i引用的就是ivec2的数据了,没有改变啥.当然没问题了
kiffa 2009-03-07
  • 打赏
  • 举报
回复
to1楼:swap本身就是vector的成员函数啊,STL本身就有

然后还有:

int main()
{
vector<int> ivec(3,1);
ivec.reserve(10);
int &i = ivec[2];

vector<int> ivec2(3,2);
ivec.swap(ivec2);

ivec.push_back(2);
i = 5;
cout << ivec[2] << endl;
}


结果是什么,是否存在问题?
  • 打赏
  • 举报
回复
1

vector::swap只是交换2个vector保存的数据指针.
pengzhixi 2009-03-07
  • 打赏
  • 举报
回复
你swap函数的定义呢?

64,662

社区成员

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

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