如何在删除矢量行时更快
How to be faster while deleting vector row?
这对我想做的事情来说太长了。有什么办法让它更快吗?
编辑很抱歉,我一直有一个高质量的帖子代码问题,所以我只发布了最低限度的帖子。
我想做的是一个奥马哈扑克股票计算器。
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
算法,而不是编写循环等。
- 将数组的地址分配给变量并删除
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- C/C++编译器通常会删除重复的库吗
- 从链接列表c++中删除一个项目
- C++如何通过用户输入删除列表元素
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- 是否需要删除包含对象的"pair"?
- 如何在自删除后将对象设置为nullptr
- 迭代时从向量和内存中删除对象
- 使用函数"remove"删除重复元素
- 如何从多映射中删除特定的重复项
- 运算符C++ "delete []"仅删除 2 个前值
- 删除指向指针的指针是运行时错误吗
- 将指针设置为"nullptr"并不能防止双重删除?
- 为什么示例代码访问IUnknown中已删除的内存
- 如何通过 getter 函数删除矢量的元素?
- 从控制台中删除最后打印的元素
- C++中的线程安全删除
- 如何从存储在std::映射中的std::集中删除元素
- 是否有C++编译器选项允许激进地删除所有函数调用,并将参数传递给具有空体的函数