相关疑难解决方法(0)

在构造时将C++迭代器的范围连接成const向量成员变量

我有一个X类,我在这里提供了一个片段:

class X {
  public:
    template <typename Iter>
    X(Iter begin, Iter end) : mVec(begin, end) {}

  private:
    vector<Y> const mVec;
};
Run Code Online (Sandbox Code Playgroud)

我现在想为这个类添加一个新的连接构造函数,如:

template <typename Iter1, typename Iter2>
X(Iter1 begin1, Iter1 end1, Iter2 begin2, Iter2 end2) : mVec(???) { ??? }
Run Code Online (Sandbox Code Playgroud)

这样的构造函数会将两个范围[begin1,end1]和[begin2,end2]连接到mVec中.挑战是

1)我想在mVec上保留const,因此在X的其他方法中它被认为是常量.

2)如果可能的话,我想避免不必要的副本.也就是说,一种解决方案是使用静态方法将非const临时构造到范围1,插入范围2并返回它,然后将连接构造函数定义为

template <typename Iter1, typename Iter2>
X(Iter1 begin1, Iter1 end1, Iter2 begin2, Iter2 end2) 
  : mVec(concatenate(begin1, end1, begin2, end2)) { }
Run Code Online (Sandbox Code Playgroud)

但我认为,这至少会复制一次所有的价值.

c++ constructor iterator stl concatenation

7
推荐指数
1
解决办法
3274
查看次数

创建一个遍历2个容器的c ++迭代器

我需要一个像以下一样的"容器".它有2个子容器,称为A和B,我需要能够迭代A,只有B,A和B组合.我不想为冗余数据使用额外的空间,所以我想让我自己的迭代器迭代A和B组合.制作自己的迭代器最简单的方法是什么?或者,另一种方法是什么?

编辑最终,我不认为这是好的设计.我重新设计了整个班级的heirarchy.重构+1.但是,我确实充分地解决了这个问题.这是我所做的缩写版本,仅供参考; 它使用boost :: filter_iterator.设T为容器中的类型.

enum Flag
{
    A_flag,
    B_flag
};

class T_proxy
{
public:
    T_proxy(const T& t, Flag f) : t_(t), flag_(f) {}
    operator T() const {return t_;}
    Flag flag() const {return flag_;}
    class Compare
    {
    public:
        Compare(Flag f) : matchFlag_(f) {}
        operator() (const T_proxy& tp) {return tp.flag() == matchFlag_;}
    private:
        Flag matchFlag_;
    };
private:
    T t_;
    Flag flag_;
};

class AB_list
{
public:
    typedef T_proxy::Compare Compare;
    typedef vector<T_proxy>::iterator iterator;
    typedef boost::filter_iterator<Compare, iterator> sub_iterator;
    void insert(const T& val, …
Run Code Online (Sandbox Code Playgroud)

c++ iterator

3
推荐指数
1
解决办法
960
查看次数

标签 统计

c++ ×2

iterator ×2

concatenation ×1

constructor ×1

stl ×1