我有一个3D点矢量,由类Point3D
,
std::vector<Point3D> points;
我还有一个size_t
向量,其中包含points
向量的索引,
std::vector<size_t> indices_true;
现在我想构建indices_true
的逆,即我想构建另一个索引向量indices_false
,其中包含indices_true
中缺少的所有索引。如何以比以下更快的方式完成:
for (size_t i = 0; i < points.size(); i++)
{
// TODO: The performance of the following is awful
if (std::find(indices_true.begin(), indices_true.end(), i) == indices_true.end())
indices_false.push_back(i);
}
答案 0 :(得分:5)
需要额外的内存,但会产生线性算法:
这是一次尝试(既未编译也未经过测试):
indices_false.reserve(points.size() - indices_true.size());
std::vector<char> isTrue(points.size(), false); // avoided std::vector<bool> intentionally
for (const size_t i : indices_true)
{
isTrue[i] = true;
}
for (size_t i = 0; i < points.size(); ++i)
{
if (!isTrue[i])
indices_false.push_back(i);
}
答案 1 :(得分:1)
排序indices_true
并逐渐增加此排序向量中的索引k
。必要时增加它。这产生(除了初始排序)线性算法。
这是一次尝试(既未编译也未经过测试):
std::sort(begin(indices_true), end(indices_true));
indices_false.reserve(points.size() - indices_true.size());
size_t k = 0;
for (size_t i = 0; i < points.size(); ++i)
{
if (k < indices_true.size() && i > indices_true[k])
++k;
assert(k >= indices_true.size() || i <= indices_true[k]);
if (k >= indices_true.size() || i != indices_true[k])
indices_false.push_back(i);
}
}
答案 2 :(得分:1)
首先对indices_true
向量进行排序,然后使用std::binary_search
。使用std::stable_sort.
std::stable_sort(indices_true.begin(), indices_true.end());
for (size_t i = 0; i < points.size(); i++)
{
if (std::binary_search(indices_true.begin(), indices_true.end(), i))
indices_false.push_back(i);
}