random_shuffle list通过将其复制到向量并返回

时间:2013-03-25 04:47:34

标签: c++ list vector stl shuffle

我试图通过首先将其复制到向量然后再回到空列表来重新排列列表。

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-该列表包含指针。如果上述方法有效,我认为没有什么会出错(因为指针值不会改变,以后分配的变量仍然可以用它们引用),对吗?

感谢。

3 个答案:

答案 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());

会做你想做的事。不必要的第一个copyvector有一个构造函数,在这种情况下可以使用2个迭代器。

相关问题