当前位置: 首页 > 知识库问答 >
问题:

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

杜禄
2023-03-14

我创建了一个示例容器,它在内部存储在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个答案

冯和硕
2023-03-14

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

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

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

 类似资料:
  • 我假设使用以下元素按以下顺序构建一个字节数组: 对称加密的AES密钥(对于AES 128有一个随机密钥,对于AES 128有一个随机初始化向量。在CBC模式下使用AES 128和PKCS5填充进行加密。在加密之前,文本用UTF-8进行编码) AES IV 加密消息(使用ECB模式下的RSA算法和PKCS1填充、先前生成的密钥和消息收件人的公钥) 我正在做的是获取每个参数的长度,以便创建新的byte

  • 问题内容: 当我运行此代码时: 但是我得到警告 所以我去看了看文档,但是“没有文档”。但仍然没有提到初始化向量是什么以及如何使用它。谁能启发我? 我知道我可以做更多的Google搜索工作,但是在众多搜索结果中排在首位,我认为这个问题对其他遇到此问题的人可能很有用。 问题答案: IV通常是一个随机数,可确保加密文本是唯一的。 为了解释为什么需要它,让我们假设我们有一个用密钥“秘密”而不用IV加密的人

  • 问题内容: 我有一个关于在AES加密中使用初始化向量的问题。我引用以下文章/帖子将加密功能构建到程序中: [1] 基于Java256位AES密码的加密 [2]http://gmailassistant.sourceforge.net/src/org/freeshell/zs/common/Encryptor.java.html 我最初从第一个链接开始关注erickson的解决方案,但是据我所知,我

  • 问题内容: 我目前在 此URL实际上按照以下路由指示加载Module.js类: 这包含在index.js文件中定义的和元素中。 Module类具有和方法。这些设置了记录2的初始详细信息和装入信息。到目前为止一切正常。 现在,我的问题是,在Module.js的孙组件中,我使用以下Redirect重定向到另一个页面,例如第3页: 构造函数或componentWillMount无法运行,因此记录#3无法

  • 类似于这个问题:如何在Jooq中初始化和创建ResultSet和记录?但使用自定义行类型记录而不是简单的表记录。我正在实例化一个jooq记录以用于模拟,但该记录有超过22列并包含来自许多连接表的行,所以我使用RecordImpl。 这引发异常 java.lang.IllegalArgumentException:行()中不包含字段(“course\u id”) 注意,我没有直接使用RecordIm

  • 问题内容: 据我所知,点击率模式不使用初始向量。它只需要一个计数器,用给定的密钥对其进行加密,然后将结果与明文进行XOR运算以得到密文。 其他分组密码模式(例如CBC)在进行加密之前,会将明文与初始向量进行异或。 所以这是我的问题。我在Java中有以下代码(使用bouncycastle库): 使用相同的键对上述代码进行的每个不同调用都会产生不同的输出!但是在做的时候: 在上述代码的每次调用中,我都