开发者

set vs vector with custom iterator

开发者 https://www.devze.com 2023-01-24 00:58 出处:网络
I understand this question may be quickly flagged as a duplicate of many other more popular questions, but I\'ll still ask it:

I understand this question may be quickly flagged as a duplicate of many other more popular questions, but I'll still ask it:

I need a container that provides duplicate checking on insert (like std::set, but allows me to modify elements already present (like std::vector). It should also be relatively fast to search for elements (which would prefer std::set again). Would it be better to use a vector and perhaps a custom duplicate-checking insert_ite开发者_开发知识库rator instead of modifying set elements by erasing and reinserting them?

Thanks


What is to stop you from using a std::set? If you need to modify an element, copy it, erase it, then re-insert.


Have you looked into using a map?

Reference

A map may be a good solution to your problem.


If your strings are long and performance is critical then you may be stuck with a custom container that wraps something like a parallel vector<string> and set<string *>. Provide a custom comparator for the set so that it dereferences through the pointer to make the comparisons. To modify an element, remove the pointer from the set, modify the string, then reinsert the pointer.

This get a bit messy when you want to remove container elements, so you would want to use some form of lazy deletion. At that point you are very close to a full-blown free-object pool for your strings.

If you're using a vector of strings in performance-critical code, then watch out for the vector reallocations which would manually copy each string into the new memory chunk. You can bypass that by watching for an upcoming reallocation, creating a new vector of empty strings (pre-reserved to double size), and then using string::swap on each element to move the old data into the new larger vector.

Things will be much nicer when c++0x move semantics are widely available.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号