c++ - vector 中元素范围的迭代器,其属性具有特定值

标签 c++ stl vector g++

我有一个对象 vector ,我想返回其属性具有特定值的元素范围。这是结构:

class A {
public:
  std::vector<B*> vec_;
  pair<vector<B*>::iterator, vector<B*>::iterator> getElements(unsigned int attr_val);
  unsigned int name() { return name_; }
private:
  unsigned int name_;
};

class B {
public:
  unsigned int attr() { return attr_; }
  A* source() { return source_; }
  B* dest() { return dest_; }
private:
  A* source_;
  B* dest_;
  unsigned int attr_;
};

vector vec_ 已经按 attr_dest_->name() 排序(按此顺序)。现在我想返回所有元素,其 attr_ 等于 attr_val

实现 getElements(unsigned int attr_val) 的合适的 STL 算法是什么(或者甚至有 vector 成员函数?)?

最佳答案

您需要一个值传递给 equal_range,显然要使用的是指针。获得一个的明显方法是创建一个具有正确 attr_ 值的 B 实例,并编写一个仅涉及 attr( )。我假设你已经知道如何做到这一点,因为你设法对 vector 进行了排序;-)

如果 vector 中没有空指针,您可以改为这样做:

struct FindAttr {
    unsigned int attr;
    FindAttr(unsigned int attr) : attr(attr) {}
    bool operator()(B *left, B *right) {
        unsigned int leftval = left ? left->attr() : attr;
        unsigned int rightval = right ? right->attr() : attr;
        return leftval < rightval;
    }
};

...

return equal_range(vec_.begin(), vec_.end(), nullptr, FindAttr(value));

你可以把它变成一个 lambda:

return equal_range(vec_.begin(), vec_.end(), nullptr, [=value](B *left, B *right) {
    unsigned int leftval = left ? left->attr() : attr;
    unsigned int rightval = right ? right->attr() : attr;
    return leftval < rightval;
});

您实际上可以完全删除指针,给出我认为“最干净”的解决方案:

struct FindAttr {
    bool operator()(B *left, unsigned int rightval) {
        return left->attr() < rightval;
    }
    bool operator()(unsigned int leftval, B *right) {
        return leftval < right->attr();
    }
};

...

return equal_range(vec_.begin(), vec_.end(), value, FindAttr());

据我所知,对于 lambda 没有直接等价物,因为 lambda 只能有一个调用签名。我想您可以编写一个采用 boost::variant(或从 unsigned intB* 隐式转换的任何类型)的 lambda ,它会记住它是哪一个)。

关于c++ - vector 中元素范围的迭代器,其属性具有特定值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13858450/

相关文章:

c++ - g++ 4.9.2 回归传递引用 'this'

c++ - STL 算法是否针对速度进行了优化?

c++ - 从 Base* 的容器向下转换为 Derived* 而无需显式转换

c++ - OpenCL 和 std::vector<bool> 不兼容

c++ - 将 YUY2 转换为 YV12

C++:未使用函数返回值时如何触发编译器错误?

c++ - std::forward 没有完美转发?

c++ - 无限循环搜索 C++ std::map

c++ - 在 C++ 中流式传输字符串文字

c++ - 按字母顺序将对象插入 vector C++