【问题标题】:Safe To Modify std::pair<U, V>::first in vector of pairs?在成对向量中修改 std::pair<U, V>::first 是否安全?
【发布时间】:2008-12-01 06:54:59
【问题描述】:

我目前正在研究 DNA 数据库类,并且我目前将数据库中的每一行与匹配分数(基于编辑距离)和实际 DNA 序列本身相关联,在迭代循环?

typedef std::pair<int, DnaDatabaseRow> DnaPairT;
typedef std::vector<DnaPairT>          DnaDatabaseT;

// ....

for(DnaDatabaseT::iterator it = database.begin();
    it != database.end(); it++)
{
    int score = it->second.query(query);
    it->first = score;
}

我这样做的原因是我以后可以按分数对它们进行排序。我已经尝试过地图并收到关于先修改的编译错误,但也许有比这更好的方法来存储所有信息以供以后排序?

【问题讨论】:

    标签: c++ sorting std-pair


    【解决方案1】:

    回答你的第一个问题,是的。修改对中的成员是非常安全的,因为对中的实际数据不会影响向量本身。

    编辑:我感觉您在使用地图时遇到了错误,因为您试图修改地图内部对的first 值。这是不允许的,因为该值是地图内部运作的一部分。

    dribeas所述:

    在地图中,您不能先更改,因为它会破坏地图作为已排序平衡树的不变量

    编辑:要回答您的第二个问题,我认为您构建数据的方式没有任何问题,但我会让数据库保存 pointers 到 @ 987654323@ 对象,而不是对象本身。这将大大减少在排序过程中复制的内存量。

    #include <vector>
    #include <utility>
    #include <algorithm> 
    
    typedef std::pair<int, DnaDatabaseRow> DnaPairT;
    typedef std::vector<DnaPairT *>       DnaDatabaseT;
    
    // ...
    
    // your scoring code, modified to use pointers
    void calculateScoresForQuery(DnaDatabaseT& database, queryT& query)
    {
        for(DnaDatabaseT::iterator it = database.begin(); it != database.end(); it++)
        {
            int score = (*it)->second.query(query);
            (*it)->first = score;
        }
    }
    
    // custom sorting function to handle DnaPairT pointers
    bool sortByScore(DnaPairT * A, DnaPairT * B) { return (A->first < B->first); }
    
    // function to sort the database
    void sortDatabaseByScore(DnaDatabaseT& database)
    {
        sort(database.begin(), database.end(), sortByScore);
    }
    
    // main
    int main()
    {
        DnaDatabaseT database;
    
        // code to load the database with DnaPairT pointers ...
    
        calculateScoresForQuery(database, query);
        sortDatabaseByScore(database);
    
        // code that uses the sorted database ...
    }

    您可能需要寻找更有效的方法的唯一原因是您的数据库太大以至于排序循环需要很长时间才能完成。不过,如果是这种情况,我想您的 query 函数将占用大部分处理时间。

    【讨论】:

    • 在地图中你不能先改变,因为它会破坏地图作为排序平衡树的不变量。
    • @dribeas:完美的描述。谢谢你!我已将该行添加到我的答案中。
    【解决方案2】:

    你不能修改,因为 std::pair 的变量 first 被定义为 const

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-16
      • 2020-03-09
      • 2018-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多