我理解这个问题可能会被迅速标记为许多其他更受欢迎的问题的副本,但我仍然会问:
我需要一个在插入时提供重复检查的容器(如std::set
),但允许我修改已存在的元素(如std::vector
)。搜索元素也应该相对较快(更喜欢std::set
。使用矢量和自定义重复检查insert_iterator而不是通过擦除和重新插入来修改set元素会更好吗?
由于
答案 0 :(得分:3)
什么阻止您使用std::set
?如果您需要修改元素,复制它,擦除它,然后重新插入。
答案 1 :(得分:1)
答案 2 :(得分:0)
如果您的字符串很长且性能很关键,那么您可能会遇到一个包含类似并行vector<string>
和set<string *>
之类的自定义容器。为集合提供自定义比较器,以便通过指针取消引用以进行比较。要修改元素,请从集合中删除指针,修改字符串,然后重新插入指针。
当您想要删除容器元素时,这会变得有点混乱,因此您可能希望使用某种形式的延迟删除。那时你非常接近一个完整的自由对象池,为你的字符串。
如果你在性能关键代码中使用字符串向量,那么请注意向量重新分配,它会手动将每个字符串复制到新的内存块中。您可以通过观察即将到来的重新分配,创建一个新的空字符串向量(预先保留为double size),然后在每个元素上使用string :: swap将旧数据移动到新的更大的向量中来绕过它。
当c ++ 0x移动语义广泛可用时,情况会更好。