c++ - 包含独特元素的列表

标签 c++ collections

我需要一个容器,其中:

  • 当我添加一个尚不存在的新元素时,它会被添加到列表的顶部
  • 当我添加一个已经存在的元素时,它没有被添加,我得到它在列表中的索引
  • 一旦元素被插入,它总是有相同的索引,并且可以使用这个索引访问它
单独使用

std::set 是不够的,因为我无法使用 [index] 访问元素。 std::list 也不是,因为它不存储唯一的唯一元素。

我使用了 listmap 的混合解决方案,但也许有一些标准的通用模板?

我不想使用 boost。在每次插入后调用 list::unique 不是解决方案。

最佳答案

如果您只使用 std::list (或 std::vector ,就此而言), 如果你不想,你就不会绕过线性搜索 避免重复,但你想保留原来的顺序。一个简单的 std::vector基于的解决方案可能是:

int
createIndex( std::vector<T>& references, T const& newValue )
{
    int results = std::find( references.begin(), references.end(), newValue )
                                    - references.begin();
    if ( results == references.size() ) {
        references.push_back( newValue );
    }
    return results;
}

或者,您可以使用 std::map :

int
createIndex( std::map<T, int>& references, T const& newValue )
{
    st::map<T, int>::iterator results = references.find( newValue );
    if ( results == references.end() ) {
        results = references.insert(
                    std::make_pair( newValue, references.size() ) ).first;
    }
    return results->second;
}

(假设 T 支持 < 。如果不支持,您必须建立 一个排序标准。或者使用 unordered_map并为 它。)

关于c++ - 包含独特元素的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10244189/

相关文章:

java - 使用一个对象从集合中移除元素的优点

java - 在java中以特定顺序重新排序ArrayList

c++ - ZeroMQ SUB 从不接收消息

c++ - 如果字段被修改,指向重复 GPB 字段的项目的指针是否保持有效?

c++ - 点云库简单示例链接错误

c++ - std::apply 到模板函数中的构造函数

c++ - 不能使用基类模板成员函数

arrays - 如果不存在,MongoDB 将值添加到数组

java - 如何在Java中实现可通过列名和行号访问的可变大小表?

java - 开箱即用的 Java 直接比较器