我正在尝试交换两个std :: list<在Visual 2005下的dontcare *> :: iterators。
Iter it1 = ... ,it2 = ...; // it1 and it2 are ok, not end() or such
if(...){
std::swap(it1,it2);
}
交换有效,但是当我离开if()范围时,it1指向0xbaadfood。 It2还可以。我尝试了几种变体,包括swap_iter和手工交换。
任何帮助表示赞赏:)
修改
好的,非常羞耻。
交换的it1是if范围内的局部变量。
F **王cut'n粘贴。抱歉浪费你的时间:/
答案 0 :(得分:4)
以下计划
#include <iostream>
#include <vector>
#include <algorithm>
int main(){
std::vector<int> v;
for(std::vector<int>::size_type idx=0; idx<10; ++idx)
v.push_back(static_cast<int>(idx));
std::vector<int>::iterator it1 = v.begin();
std::vector<int>::iterator it2 = v.begin() + v.size()/2;
std::cout << static_cast<void*>(&*it1) << ':' << *it1
<< ' ' << static_cast<void*>(&*it2) << ':' << *it2 << '\n';
std::swap(it1,it2);
std::cout << static_cast<void*>(&*it1) << ':' << *it1
<< ' ' << static_cast<void*>(&*it2) << ':' << *it2 << '\n';
return 0;
}
编译,运行,并按预期打印
00032A28:0 00032A3C:5 00032A3C:5 00032A28:0
对我来说。
如果它为您做了其他事情,您的编译器或标准库都会损坏。
如果它对你做同样的事情,那么错误就是你的代码和我的代码之间的差异。在哪里,我们无法知道,因为我们不知道你的代码。
答案 1 :(得分:3)
您在if
内省略了代码吗?很可能是if
检查中的其他内容,但在交换之后实际上使迭代器无效(可能是擦除)。
答案 2 :(得分:0)
WAG但是也许交换是构造新对象并复制它们(并且副本无效,因为它使用默认构造函数)?