如何在删除矢量行时更快

How to be faster while deleting vector row?

本文关键字:删除      更新时间:2023-10-16

这对我想做的事情来说太长了。有什么办法让它更快吗?

编辑很抱歉,我一直有一个高质量的帖子代码问题,所以我只发布了最低限度的帖子。

我想做的是一个奥马哈扑克股票计算器。

A-它拿着我们给他的4张牌(myhand[4](,用所有可能的牌组合检查是否有重复的牌。

B-如果有任何重复,它希望删除包含该手的向量的行(因此,当我们稍后计算股权时,我们不会根据某人不可能拥有的手进行计算(

int myhand[4] = { 3, 12, 22, 10 };
    vector<vector<int> > vec(4, vector<int>(270725));
    for (int m = 0; m < vec[0].size(); m++) { // A
        for (int k = 0; k < 4; k++) {
            for (int j = 0; j < 4; j++)
                if (myhand[k] == vec[j][m]) {
                    for (int i = 0; i < 4; i++) {
                        vec[i].erase(vec[i].begin() + m); // B
                    }
                    k = 0;
                    j = 0;
                    break;
                }
        }
    }

有没有办法用这个代码提高效率?

谢谢,Kaven

在std::vector这样的非关联容器上搜索成本太高。

如果只找到Hands,std::set就可以了,但就问题域而言,有问题的密钥是复合密钥(4元组的卡(,并且std::set没有特殊的方法来处理之类的事情

"查找包含某个组件的所有密钥。">

std::map也只能解决问题的一部分。

boost::bimap可以考虑,但我提出了一种不同的方法:


问题的数据可以通过二分图建模(左边的卡片,右边的卡片,l<->r边表示从"卡片顶点"看"在手",如果从"手顶点"看,则表示"包含卡片">

因此,比起基于STL的自编码解决方案,我更喜欢使用(基于STL的(boost::graph。


另一种实用的方法是依赖于内存中的数据库,该数据库可以使用SQLite轻松创建;请参加http://www.sqlite.org/inmemorydb.html

您最好通过一个看起来有点像这样的循环来构建您想要处理的组合:

#include <cassert>
#include <algorithm>
#include <vector>
#include <iostream>
#include <numeric>
int main (int, char* [])
{
    // Build a deck of cards
    std::vector<int> deck( 52 );
    std::iota( deck.begin(), deck.end(), 0 );
    // Remove 'myhand'
    const int myhand[] =  { 3, 12, 22, 10 };
    for (int i = 0; i < 4; ++i) {
        deck[myhand[i]] = -1;
    }
    deck.resize( std::remove( deck.begin(), deck.end(), -1 ) - deck.begin() );
    // Iterate over all possible remaining entries.
    size_t num_processed = 0;
    for (auto c1 = deck.begin(); c1 != deck.end(); ++c1) {
        for (auto c2 = c1 + 1; c2 != deck.end(); ++c2) {
            for (auto c3 = c2 + 1; c3 != deck.end(); ++c3) {
                for (auto c4 = c3 + 1; c4 != deck.end(); ++c4) {
                    // Compute equity of (*c1, *c2, *c3, *c4) here.
                    ++num_processed;
                }
            }
        }
    }
    // Verify that 48! / (44! * 4!) entries were processed.
    assert ( num_processed == (48*47*46*45) / (4*3*2*1) );
    return 0;
}

顺便说一句,我写了一个扑克权益计算器。

试图根据我所理解的回答。

myhand[k] == vec[j][m]时,您正在制作k=0。它打破了循环的j。

但是k for循环再次从零开始。

如果它再次匹配条件myhand[k] == vec[j][m],则它继续。

除此之外,请考虑使用std::find算法,而不是编写循环等。