如何计算给定向量指数的补集?

时间:2015-04-27 15:45:36

标签: c++ vector stl

我有一个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);
}

3 个答案:

答案 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);
}