首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++迭代对象向量并将STL算法应用于成员变量

C++迭代对象向量并将STL算法应用于成员变量
EN

Stack Overflow用户
提问于 2015-12-10 10:02:24
回答 1查看 761关注 0票数 1

在定制对象向量上迭代,但只访问一个成员以应用通用STL算法的快速方法是什么?

代码语言:javascript
复制
struct Foo
{
    std::string a;
    double b = 1.0;
};

int main()
{
    std::vector<Foo> fooVector(20);

    // iterate over all members b -- as if we were iterating over a std::vector<double>
    std::discrete_distribution<int> dist(/*??*/, /*??*/);
}

我是说“快”

  • 没有自定义迭代器--或者只有非常轻量级的迭代器(--几行代码,没有boost iterator_facade等等),
  • 不修改取消引用操作符(-没那么快)。
EN

回答 1

Stack Overflow用户

发布于 2015-12-10 12:30:24

std::discrete_distribution<...>的构造函数不支持任何显式的方法来项目值(就像一个函数对象(可选地应用于在使用之前转换*it的结果)。因此,我认为有三种基本方法:

  1. 使用中间std::vector<double>获得迭代器产生双倍的范围: 如所需的std::fooVector.end(),std::back_inserter(tmp),福康斯特&f{返回f.b;};std::discrete_distribution d(tmp.begin(),tmp.end());
  2. Foo上使用转换运算符转换为double可能是可行的: Foo类{ // .操作符double() const {返回这个->b;};// .std::discrete_distribution d(fooVector.begin(),fooVector.end());
  3. 为迭代器创建一个包装器并使用它。它不需要任何花哨的东西,但是将一个简单的输入迭代器放在一起仍然是比较复杂的: 模板类project_iterator { InIt it;public:显式project_iterator(InIt it):it(it) {} double运算符*() const {InIt*->it;} project_iterator& operator++() { ++this->it;返回*this;} project_iterator operator++(int) { project_iterator rc(*this);this->运算符++();返回*this;} bool operator==(project_iterator const&其他) const {返回此->it == other.it;} bool运算符!=( project_iterator const&其他) const { return!(* ==其他);};模板project_iterator项目( it) {返回project_iterator(it);}命名空间std {模板类iterator_traits

显然,这些方法是有变化的,但我不认为还有什么可以巧妙地做。缺少的本质上是一种具有序列投影的通用方法(我通常将它们称为属性映射)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34198818

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档