相关疑难解决方法(0)

C++ std :: set update很乏味:我无法更改元素

我发现更新操作std::set很繁琐,因为cppreference上没有这样的API .所以我现在做的是这样的:

//find element in set by iterator
Element copy = *iterator;
... // update member value on copy, varies
Set.erase(iterator);
Set.insert(copy);
Run Code Online (Sandbox Code Playgroud)

基本上迭代器返回的Set是a const_iterator,你不能直接改变它的值.

有一个更好的方法吗?或者也许我应该std::set通过创建我自己的(我不知道它是如何工作的...)来覆盖.

c++ stl set

66
推荐指数
5
解决办法
2万
查看次数

在集合中修改对象的可变成员是否安全?

我很好奇以下情况是否安全.

我有以下类定义:

class ActiveStatusEffect
{
public:
    StatusEffect* effect;
    mutable int ReminaingTurns;
    ActiveStatusEffect() : ReminaingTurns(0)
    {
    }
    //Other unimportant stuff down here
}
Run Code Online (Sandbox Code Playgroud)

然后我将一组这些存储在std :: set中,如下所示:

struct ASECmp
{
    bool operator ()(const StatusEffects::ActiveStatusEffect &eff1, const StatusEffects::ActiveStatusEffect &eff2)
    {
        return eff1.effect->GetPriority() < eff2.effect->GetPriority();
    }
};
std::set<StatusEffects::ActiveStatusEffect, ASECmp> ActiveStatusEffects;
Run Code Online (Sandbox Code Playgroud)

我将RemainingTurns标记为可变,因为我希望能够更改它而不必不断地擦除/插入到集合中.即

void BaseCharacter::Tick(Battles::BattleField &field, int ticks)
{
    for (auto effect = ActiveStatusEffects.begin(); effect != ActiveStatusEffects.end();)// ++index)
    {
           auto next = effect;
            ++next;
        if (effect->effect->HasFlag(StatusEffects::STATUS_FLAGS::TickEffect) && effect->ReminaingTurns > 0)
        {                       
            effect->effect->TickCharacter(*this, field, ticks);
            --effect->ReminaingTurns;

        } …
Run Code Online (Sandbox Code Playgroud)

c++ mutable set c++11

6
推荐指数
1
解决办法
1321
查看次数

如何告诉std :: set'刷新'它的排序?

如果集合中元素的值发生更改,则排序可能不再正确.如这个小程序所示:

#include <algorithm>
#include <iostream>
#include <set>
#include <string>

struct Comp
{
    bool operator()(const std::string * lhs, const std::string * rhs)
    {
        return *lhs < *rhs;
    }
};

int main()
{
    typedef std::set<std::string*, Comp> MySet;
    MySet mySet;

    std::string * a = new std::string("a");
    mySet.insert(a);

    std::string * c = new std::string("c");
    mySet.insert(c);

    std::string * b = new std::string("b");
    mySet.insert(b);

    for (MySet::iterator it = mySet.begin(); it != mySet.end(); ++it)
    {
        std::cout << *(*it) << std::endl;
    }

    // Ouput has correct order:
    // …
Run Code Online (Sandbox Code Playgroud)

c++ stl

4
推荐指数
2
解决办法
1011
查看次数

以下代码使用std :: set"legal"?

我有这个代码:

set<int>::iterator new_end = 
                   set_difference(set1.begin(), set1.end(),
                                  set2.begin(), set2.end(),
                                  set1.begin());
set1.erase(new_end, set1.end);
Run Code Online (Sandbox Code Playgroud)

它在视觉工作室中编译并运行良好.然而,在之前的一个问题中,人们说set应该是一个迭代器const.我没有在标准中看到类似的东西.有人可以告诉我它在哪里,或者这是明确定义的行为吗?

如果不是,请提供符合我需要的代码.有没有办法在不创建临时集的情况下执行此操作?

c++ iterator stl set

3
推荐指数
2
解决办法
570
查看次数

修改STL容器的内容是否安全?

这是非常基本的.

我记得在某个地方发现了一个警告(我现在找不到),你不应该直接修改STL容器的内容,因为它可能会破坏容器的内部记录.从那以后,只要你想要修改一个元素,就应该使用boost的ptr_containers之类的东西.

这基本上就是我想要做的:

int main (int argc, char *argv[]) {
    std::vector<int> jambone;

    jambone.push_back(2);
    jambone.front() = 4;
    std::cout<< jambone.front();
}
Run Code Online (Sandbox Code Playgroud)

我不想在这里用多线程或任何东西做任何事情.那应该没事,对吧?如果它是一个装满物体的容器会不会有任何不同,我在其中一个上面调用了一个mutator?

c++ stl

2
推荐指数
1
解决办法
175
查看次数

标签 统计

c++ ×5

stl ×4

set ×3

c++11 ×1

iterator ×1

mutable ×1