提问者:小点点

如何用标准向量初始化自定义向量类型


我创建了一个示例容器,它在内部存储在std::vector中。我希望能够用std::vector初始化容器。因此,我创建了一个构造函数,它采用std::initializer_list,还采用begin和end。

但我似乎不能这样初始化:

const std::vector< uint8_t > vec1 { 1,2,3,4,5 };
UsingVectorExample ex{ vec1.begin(), vec1.end() };  // compilation errors on this line

这里的问题是什么?我该怎么修复?

代码在这里:

#include <vector>
#include <cstdint>

class UsingVectorExample
{
public:
    class iterator : public std::vector<uint8_t>::iterator
    {
    public:
        explicit iterator(typename std::vector<uint8_t>::iterator c)
            : std::vector<uint8_t>::iterator(c)
        {}
    };

    class const_iterator : public std::vector<uint8_t>::const_iterator
    {
    public:
        explicit const_iterator(typename std::vector<uint8_t>::const_iterator c)
            : std::vector<uint8_t>::const_iterator(c)
        {}
    };

    explicit UsingVectorExample(std::initializer_list<uint8_t> list)
        : m_vector(list.size())
    {
        m_vector.assign(list);
    }

    UsingVectorExample(iterator begin, iterator end)
        : m_vector(begin, end)
    {}

    UsingVectorExample(const_iterator begin, const_iterator end)
        : m_vector(begin, end)
    {}

    iterator begin()
    {
        return iterator(m_vector.begin());
    }

    iterator end()
    {
        return iterator(m_vector.end());
    }

    const_iterator begin() const
    {
        return const_iterator(m_vector.begin());
    }

    const_iterator end() const
    {
        return const_iterator(m_vector.end());
    }

    void push_back(const uint8_t& val)
    {
        m_vector.push_back(val);
    }

private:
    std::vector<uint8_t>  m_vector;
};


int main() {

    const std::vector< uint8_t > vec1 { 1,2,3,4,5 };
    UsingVectorExample ex{ vec1.begin(), vec1.end() };  // compilation errors on this line
}

共1个答案

匿名用户

这里的问题是迭代器构造器是explicit。这意味着vec1.begin()不能使用VectoreXample::Const_Iterator转换为,而不需要像下面这样显式地进行操作

UsingVectorExample ex{ UsingVectorExample::const_iterator{vec1.begin()}, 
                       UsingVectorExample::const_iterator{vec1.end()} }; 
                       

要避免这样做,只需删除explicit。您可以看到,在这个活生生的例子中