列出具有独特元素

时间:2012-04-20 10:09:20

标签: c++ collections

我需要一个容器,其中:

  • 当我添加一个尚不存在的新元素时,它会被添加到列表顶部
  • 当我添加一个已经存在的元素时,它没有添加,我在列表中得到了它的索引
  • 插入元素后,它始终具有相同的索引,并且可以使用此索引
  • 进行访问

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

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

我不想使用提升。每次插入后调用list::unique都无法解决。

1 个答案:

答案 0 :(得分:3)

如果您只使用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并为其定义哈希码 它)。