如何使用标准向量初始化自定义向量类型
How to initialise custom vector type with a standard vector
我创建了一个示例容器,它在内部存储在 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
除非你像
那样明确地这样做
UsingVectorExample ex{ UsingVectorExample::const_iterator{vec1.begin()},
UsingVectorExample::const_iterator{vec1.end()} };
如果不必这样做,只需删除 explicit
。你可以看到在这个 live example
中工作
我创建了一个示例容器,它在内部存储在 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
除非你像
UsingVectorExample ex{ UsingVectorExample::const_iterator{vec1.begin()},
UsingVectorExample::const_iterator{vec1.end()} };
如果不必这样做,只需删除 explicit
。你可以看到在这个 live example