【问题标题】:return bool as a value in bool operator[] in cpp返回 bool 作为 cpp 中 bool operator[] 中的值
【发布时间】:2020-09-10 07:22:11
【问题描述】:

所以基本上我有一个包含布尔值(真、假)的 std::vector 容器,我需要一个运算符 [],但是当我返回具有正确索引的值(布尔)时,它给了我像这样的错误: 无法将“bool&”类型的非常量左值引用绑定到“bool”类型的右值|

我的运算符如下所示:

bool& operator[] ( unsigned int idx) {
    typename std::vector<bool>::iterator retval;
    for (typename std::vector<std::vector<bool> *>::iterator it = data.begin(); it != data.end(); ++it) {
        for (typename std::vector<bool>::iterator cont_it = (*it)->begin(); cont_it != (*it)->end(); ++cont_it) {
            if (idx == 0) {
                retval = cont_it;
            }
            idx--;
        }
    }
    return *retval;
}

以及出现错误的调用:

ivb[0] = false;
ivb[1] = true;

【问题讨论】:

  • 不幸的是 std::vector&lt;bool&gt;special。一种特殊的方式是您不能取消引用std::vector&lt;bool&gt;::iterator 并获得bool&amp;。我想你应该有类似 struct bool_wrapper { bool value; } 的东西,然后你可以使用 std::vector&lt;bool_wrapper&gt; 代替。
  • auto 代替typename std::vector&lt;std::vector&lt;bool&gt;*&gt;::iterator 怎么样?

标签: c++ boolean return-value


【解决方案1】:

一点性能提升到@Jarod42 answer:

std::vector<bool>::reference operator[](unsigned int idx) {
    for (auto &inner : data) {
        if (idx < inner.size()) {
            return inner[idx];
        }
        idx -= inner.size();
    }
    throw std::runtime_error("out of range");
}

并假设所有内部向量的大小相同:

std::vector<bool>::reference operator[](unsigned int idx) {
    // vectors_sizes = data[0].size()
    if (idx >= vectors_sizes * data.size())
        throw std::runtime_error("out of range");
    return data[idx / vectors_sizes][idx % vectors_sizes];
}

【讨论】:

    【解决方案2】:

    std::vector 可能很特别,带有打包优化(所以它的operator[] 返回包装器/代理类)。

    然后你可以转发返回值:

    std::vector<bool>::reference operator[] ( unsigned int idx) { 
        for (auto& inner : data) {
            for (auto&& e : inner) {
                if (idx-- == 0) {
                    return e;
                }
            }     
        }
        throw std::runtime_error("out of range");
    }
    

    【讨论】:

      猜你喜欢
      • 2021-11-11
      • 2015-05-10
      • 1970-01-01
      • 2013-02-28
      • 2021-08-14
      • 2023-02-22
      • 1970-01-01
      • 1970-01-01
      • 2023-04-09
      相关资源
      最近更新 更多