如何使用 arma::vec 作为 std::map 中的键

Posted

技术标签:

【中文标题】如何使用 arma::vec 作为 std::map 中的键【英文标题】:How to use arma::vec as key in std::map 【发布时间】:2020-02-29 18:21:00 【问题描述】:

我已经实现了以下代码来更新马尔可夫模型,但编译器不允许我使用犰狳向量作为 std::map 中的键。有什么想法吗?

typedef std::vector<std::map<arma::vec, int>> vmaps_t;
struct markov

    uint8_t maxord;
    vmaps_t m_maps;
    std::vector<char> m_chars;

    markov(uint8_t maxord)
    
        m_maps = vmaps_t(maxord);
    
    void update(const arma::vec &v)
    
        for (size_t ord = 0; ord < maxord; ord++)
        
            if (v.n_elem > ord)
            
                if (std::find(m_chars.begin(), m_chars.end(), v.back()) == m_chars.end()) //just to tell elem not in vect...
                
                    m_chars.push_back(v.back());
                
                arma::vec seq = v.rows(v.n_rows - ord, v.n_rows - 1);
                if (m_maps[ord].find(seq) == m_maps[ord].end())
                
                    m_maps[ord][seq] = 0;
                
                m_maps[ord][seq]++;
            
        
    
;

错误:无法将 'arma::enable_if2, arma::Col, arma::glue_rel_lt> >::result aka const arma::mtGlue, arma::Col, arma::glue_rel_lt>' 转换为 'bool'作为回报 返回 __x

【问题讨论】:

【参考方案1】:

要使用 anything 作为std::map 中的键,您需要使用“anything”来实现operator&lt;。该运算符需要为元素实现严格的弱排序

如果您正在使用的类当前没有实现这样的运算符,则它不能是映射键。解决方案是添加/实现这样的运算符。

【讨论】:

@Moleson std::unordered_map 完全不同。它使用哈希函数将元素组织到桶中。两者没有可比性——它们有不同的要求。请阅读您正在使用的容器的文档。

以上是关于如何使用 arma::vec 作为 std::map 中的键的主要内容,如果未能解决你的问题,请参考以下文章

在 Rcpp 中选择 NumericVector 和 arma::vec

(Rcpp, armadillo) 将 arma::vec 转换为 arma::mat

使用其他向量中的相应元素更改 arma::vec 中给定位置的元素

如何使用 SWIG 在 C++ 中调用 python 函数?

有啥办法可以把 uvec 变成 vec?

在犰狳中将矩阵除以向量