1

我正在尝试通过先将列表复制到向量然后再复制回空列表来对列表进行洗牌。

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

程序因运行时错误而崩溃:list iterator not dereferencable

1-代码有什么问题。

2-列表包含指针。如果上述方法有效,我认为不会有任何问题(因为指针值不会改变,并且分配的变量以后仍然可以被它们引用),对吧?

谢谢。

4

3 回答 3

2

我认为问题在于这两行:

agents_.clear();
copy(tmpVector.begin(), tmpVector.end(),agents_.begin());

第一行清除了agents_列表,所以它现在是空的。然后下一行尝试将存储在agents_从第一个元素开始的元素序列替换为 range 的内容[tmpVector.begin(), tmpVector.end())。这会导致未定义的行为,因为列表中没有元素。

要解决此问题,请尝试agents_.clear()从上一行中删除对的调用。这将导致copy调用agents_用适当的洗牌值覆盖列表中的现有元素。

希望这可以帮助!

于 2013-03-25T04:50:02.273 回答
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 个迭代器。

于 2013-03-25T04:57:20.273 回答
1

当您 clear() 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());
于 2013-03-25T04:51:44.577 回答