gpt4 book ai didi

c++ - 多次改组 vector 后读取访问冲突

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:41:54 26 4
gpt4 key购买 nike

对于一个学校项目,我需要用唯一的指针打乱一个 vector 。但是,当我这样做时,我会在一段时间后收到读取访问冲突错误。我创建了 vector ,然后调用了 shuffle。我做了很多次。我只是用这些值创建 vector 并将其洗牌一次,几次后我收到读取访问冲突错误。

代码

    int RandomEngine::generateRandomInt(int minValue, int maxValue)
{
std::uniform_int_distribution<int> distribution(minValue, maxValue);
std::cout << "Random getal van " << minValue << " tot " << maxValue << std::endl;
return distribution(def_rand_engine);
}

void RandomEngine::shuffleCharacterCards(std::vector<std::unique_ptr<CharacterCard>>& cards)
{
// Succeeds once but with multiple swaps read access violation
//auto randomInt = generateRandomInt(0, cards.size() - 1);
//iter_swap(cards.begin() + randomInt, cards.begin());

// Read access violation
//for (int i = 0; i < cards.size(); i++)
//{
// std::swap(cards[i], cards[std::rand() % cards.size()]);
//}

// Read access violation
//std::shuffle(cards.begin(), cards.end(), std::mt19937{ def_rand_engine});

// Read access violation
//std::random_shuffle(cards.begin(), cards.end());



// Read access violation
//std::shuffle(cards.begin(), cards.end(), std::mt19937(std::random_device()()));
}

我从静态类中调用随机播放的其他类

void CharacterCardStack::prepare()
{
std::cout << "Preparing CharacterCardStack..." << std::endl;
if(cards_.size() > 2)
{
// Shuffle the cards
RandomEngine::shuffleCharacterCards(cards_);

// Burn the first card
burnedCharacterCard_ = std::move(cards_[0]);
std::cout << "Burned charactercard: " << burnedCharacterCard_->getName() << std::endl;
cards_.erase(cards_.begin());
// Als de open kaart een koning is dan moet deze vervangen worden door een ander.
if(cards_[0]->getName() == "Koning")
{
turnedCharacterCard_ = std::move(cards_[1]);
}
else
{
turnedCharacterCard_ = std::move(cards_[0]);
}
std::cout << "Turned charactercard: " << turnedCharacterCard_->getName() << std::endl;
cards_.erase(cards_.begin());
}
else
{
std::cerr << "CharacterCardStack::prepare cards size is " << cards_.size() << std::endl;
throw std::exception("Error...");
}
for (const auto& c : cards_)
{
std::cout << "Other card: " << c->getName() << std::endl;
}
std::cout << "CharacterCardStack prepared" << std::endl;
}

最佳答案

你的逻辑有流程,你根据条件移出第一个或第二个元素:

    if(cards_[0]->getName() == "Koning")
{
turnedCharacterCard_ = std::move(cards_[1]);
}
else
{
turnedCharacterCard_ = std::move(cards_[0]);
}

然后无条件地删除第一个元素:

cards_.erase(cards_.begin());

所以你最终可能会得到移出的指针。

简单的修复可能是:

    if(cards_[0]->getName() == "Koning")
{
std::swap( cards_[0], cards_[1] );
}
turnedCharacterCard_ = std::move(cards_[0]);
std::cout << "Turned charactercard: " << turnedCharacterCard_->getName() << std::endl;
cards_.erase(cards_.begin());

这样更容易保持正确,我更喜欢使用 cards.front() 而不是 cards_[0],我认为后者更具可读性这种情况。

关于c++ - 多次改组 vector 后读取访问冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48173362/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com