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

安格斯·康伯

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

但我似乎无法像这样初始化:

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
}
内森奥利弗

这里的问题是您的迭代器构造函数是explicit. 这意味着vec1.begin()如果UsingVectorExample::const_iterator没有你明确地这样做,就不能转换为 a

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

不必这样做,只需删除explicit. 你可以看到在这个活生生的例子中工作

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章