【问题标题】:List with unique elements具有独特元素的列表
【发布时间】:2012-04-20 10:09:19
【问题描述】:

我需要一个容器,其中:

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

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

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

我不想使用 boost。每次插入后调用list::unique 是没有办法的。

【问题讨论】:

  • 自己滚动怎么样?你有没有尝试过?听起来像是对list 的一个非常薄的包装...
  • @Soohjun:用list 来实现这个并不好;初始碰撞检测将是 O(n),按索引查找也是如此。
  • 列出地图,如果您经常添加现有元素。
  • 我知道你不想使用 Boost,但这实际上是 Boost.bimap 所做的!
  • @user1158692:实际上有 2 个键(元素本身,以及为其分配的相关整数索引)。

标签: c++ collections


【解决方案1】:

如果您只使用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 支持&lt;。如果不支持,则必须建立 一个排序标准。或使用unordered_map 并为 它。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-19
    • 2017-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-09
    相关资源
    最近更新 更多