我试图通过首先将其复制到向量然后再回到空列表来重新排列列表。
vector<Agent*> tmpVector(agents_.size());
copy(agents_.begin(), agents_.end(), tmpVector.begin());
random_shuffle(tmpVector.begin(), tmpVector.end());
agents_.clear();
copy(tmpVector.begin(), tmpVector.end(),agents_.begin());
程序因运行时错误而崩溃:列出迭代器而不是可解除错误
1-代码有什么问题。
2-该列表包含指针。如果上述方法有效,我认为没有什么会出错(因为指针值不会改变,以后分配的变量仍然可以用它们引用),对吗?
感谢。
答案 0 :(得分:2)
我认为问题出在以下两个方面:
agents_.clear();
copy(tmpVector.begin(), tmpVector.end(),agents_.begin());
第一行清除agents_
列表,因此它现在为空。然后,下一行尝试将第一个元素开头的agents_
中存储的元素序列替换为范围[tmpVector.begin(), tmpVector.end())
的内容。这会导致未定义的行为,因为列表中没有元素。
要解决此问题,请尝试从上一行删除对agents_.clear()
的调用。这将导致copy
调用使用适当的混洗值覆盖agents_
列表中的现有元素。
希望这有帮助!
答案 1 :(得分:1)
清除()tmp数组时,将其大小设置为零。
副本期望目的地已经设置了足够的空间(即大小必须正确)。
第一种方法是使用后插入器:
agents_.clear();
std::copy(tmpVector.begin(), tmpVector.end(), std::back_inserter(agents_));
但是因为你在目的地使用指针 它会毫无问题地复制它们。因此,删除清除可能更容易。
// agents_.clear();
// The copy will copy over the old values with no problems.
copy(tmpVector.begin(), tmpVector.end(),agents_.begin());
答案 2 :(得分:1)
问题来自最后两行:
agents_.clear();
copy(tmpVector.begin(), tmpVector.end(),agents_.begin());
具体来说,您在列表中调用clear()
,它会销毁所有元素并使列表的大小为0,然后尝试访问begin()
。尝试取消引用begin()
然后变成未定义的行为。
您可以清理这段代码:
vector<Agent*> tmpVector(agents_.begin(), agents_.end());
random_shuffle(tmpVector.begin(), tmpVector.end());
copy(tmpVector.begin(), tmpVector.end(),agents_.begin());
会做你想做的事。不必要的第一个copy
,vector
有一个构造函数,在这种情况下可以使用2个迭代器。