如何在std::vector<bool>中找到值为true的索引?

3

我说了以下布尔向量:

v = [false ,true, false ,false ,true, false ,false ,true]

我想要另一个向量,其中包含元素为 true 的 v 向量的索引。

我有以下代码:

std::vector<int> nds; //contains the indices
for (const auto &elem : v)
{
    auto idx = &elem - &v[0];
    if (elem)
    {
        nds.push_back(idx);
    }
}

以下内容在我的 MacBook 上似乎可以工作,但在 Linux 上会导致以下错误。
src/file.cpp:76:25: error: taking address of temporary [-fpermissive]
                         auto idx = &elem - &v[0];
                                                ^

有更好的方法来查找索引吗?
附注:这只是一段较长代码的摘录。

1
密切相关 https://dev59.com/QGoy5IYBdhLWcg3wq_3O - StoryTeller - Unslander Monica
1
总的来说,我建议阅读这篇文章 https://dev59.com/33RB5IYBdhLWcg3wSVe1 - StoryTeller - Unslander Monica
如果您需要索引,请遍历索引。当您不关心它们是什么时,range循环非常有用。 - molbdnilo
在 bool 向量中,布尔值的存储通常只是一个位,该位不可寻址,因此它可能会返回一个代理而不是实际存储,这是一个临时对象。我建议永远不要使用 vector<bool> - 即使您只是将一个布尔值包装在结构体中并创建一个 vector<mybool>。 - xaxxon
2个回答

8

有更好的方法来查找索引吗?

使用经典for循环。

for (int i = 0; i != v.size(); ++i) {
  if (v[i]) nds.push_back(i);
}

4
使用 range-v3 库,您可以使用函数式编程风格的方法,将惰性迭代器 views::enumerate 与惰性 views::filterviews::transform 视图变换链接起来构建一个 std::vector<int>,其中包含原始索引中为 true 的值。
const auto nds = v | views::enumerate 
   | views::filter([](auto p) { return p.second; }) 
   | views::transform([](auto p) { return p.first; }) 
   | to<std::vector<int>>;

示例


或者,将views::transform替换为views::keys

const auto nds = v | views::enumerate 
    | views::filter([](auto p){ return p.second; })
    | views::keys
    | to<std::vector<int>>;

演示


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接