【问题标题】:iota increment vector of a class c++类 c++ 的 iota 增量向量
【发布时间】:2014-10-27 00:48:39
【问题描述】:

我最近一直在利用<numeric>iota 语句来增加int 类型的向量。但是现在我正在尝试使用该语句来增加具有 2 个成员的显式类。

所以这里是整数向量的用法:

vector<int> n(6);
iota(n.begin(), n.end(), 1);

鉴于Obj 类有一个名为m 的整数成员。构造函数将m 初始化为其对应的整数参数。这是我现在要做的:

vector<Obj> o(6);
iota(o.begin(), o.end(), {m(1)});

我尝试过类似这样的类增量重载:

Obj& operator ++() {
    *this.m++;
    return *this;
}

但我认为要么我的构造函数不是为这种重载而设计的,反之亦然。如何修改构造函数和重载以使用 iota 增加对象成员?提前致谢!

【问题讨论】:

  • 我对您的描述有点困惑:iota 增加您传递给它的值(第三个参数),而不是它修改/遍历的范围的元素。你想通过增加它们来修改这些元素,还是用增加的值覆盖它们?
  • @dyp 我想用递增的值覆盖它们,因为我的构造函数已经将它们设为 0。这可能吗?
  • iota(o.begin(), o.end(), Obj(1));
  • 是的,你需要重载,因为 iota 会调用它(否则它会如何“增加”对象?)。
  • 嗯,你也可以生成它们并增加值;)使用适当的迭代器,vector&lt;int&gt; n(make_iota_iterator(6, Obj(1)), iota_iterator&lt;Obj&gt;()); 或类似的东西(使用自定义 make_iota_iterator 函数)。跨度>

标签: c++ c++11 vector overloading increment


【解决方案1】:

更新:我更改了答案以提供 cmets 中要求的功能:即能够更新多个字段。

以类似于以下的方式格式化您的课程。您需要重载 ++ 运算符以递增 _m_c

class Obj {
    private:
        int _m;
        char _c;

    public:
        Obj(int m, char c) : _m(m), _c(c)
        {
        }

        MyClass operator++()
        {
            _m++;
            _n++;

            return *this;
        }
};

以下代码将使用 6 个 Obj 初始化向量 o,每个包含从 1 开始的 _m_c 的升序值。

vector<Obj> o(6);
iota(o.begin(), o.end(), Obj(1, 1));

【讨论】:

  • @Brett_Wolfington 谢谢,这在没有++ 过载的情况下可以工作吗?
  • 是的。不需要 ++ 重载。
  • 这是否也可以通过同时增加 2 个成员来工作;给定第二个成员,比如char?
  • @Jim22150 在这一点上,我建议提出一个包含您的问题更详细的新问题。最好是一个完整的(可编译的)示例,其中包含除创建/修改向量元素的表达式之外的所有内容。
  • Jim - 我更新了代码来回答您的问题。新代码确实会同时增加 2 个成员,但 需要重载 ++
【解决方案2】:

我不确定我是否理解您的问题。下面的代码符合你的要求吗?

#include <algorithm>
#include <iostream>
#include <vector>

class Object {
 public:
  Object(int value = 0)
      : m_value(value) { }
  Object& operator++() {
    m_value++;
    return *this;
  }
  int value() const {
    return m_value;
  }
 private:
  int m_value;
};

int main() {
  std::vector<Object> os(10);
  std::iota(os.begin(), os.end(), 0);
  for(const auto & o : os) {
    std::cout << o.value() << std::endl;
  }
}

在 OS X 10.7.4 上使用 gcc 4.8 编译我得到:

$ g++ iota-custom.cpp -std=c++11
$ ./a.out 
0
1
2
3
4
5
6
7
8
9

【讨论】:

  • 谢谢,由于冗长的解释,我给了你接受的答案。布雷特的看起来也不错。不过还是谢谢大家!
  • 这在没有 Object::operator++ (coliru.stacked-crooked.com/a/6248417793fec446) 的情况下可以正常工作。它之所以有效,是因为构造函数未标记为explicit
【解决方案3】:
#include <numeric>      // std::iota
#include <vector>
using namespace std;

class Obj
{
private:
    int m_;
public:
    auto value() const -> int { return m_; }
    Obj( int m = 0 ): m_( m ) {}
};

auto main() -> int
{
    vector<Obj> v(6);
    iota( v.begin(), v.end(), 1 );
}

【讨论】:

  • 这可能是我最喜欢的答案;我喜欢 v.11 的自动类型。我已经接受了答案。我会玩这个!
猜你喜欢
  • 2020-07-14
  • 1970-01-01
  • 2019-12-27
  • 1970-01-01
  • 2018-06-02
  • 1970-01-01
  • 1970-01-01
  • 2021-08-23
  • 1970-01-01
相关资源
最近更新 更多