【发布时间】:2013-09-17 10:57:29
【问题描述】:
我有一个vector<std::unique_ptr<X>> 和一个vector<const X*>,它们包含相同的指针集,但顺序不同。我希望唯一指针向量的排序与 const 指针向量完全相同。
我可以这样做的一种方法是:
vector<std::unique_ptr<X>> uniq_ptrs;
vector<const X*> const_ptrs;
vector<std::unique_ptr<X>> tmp(uniq_ptrs.size());
hash_map<const X*, int> indices;
for (int i = 0; i < const_ptrs->size(); ++i) {
indices[const_ptrs[i]] = i;
}
for (std::unique_ptr<X>& uniq_ptr : uniq_ptrs) {
tmp[indices[uniq_ptr.get()]].swap(uniq_ptr);
}
uniq_ptrs.swap(tmp)
就地版本,仍然带有 hash_map:
vector<const X*> const_ptrs;
hash_map<const X*, int> indices;
for (int i = 0; i < const_ptrs.size(); ++i) {
indices[const_ptrs[i]] = i;
}
for (int i = 0; i < const_ptrs.size(); ++i) {
std::swap(uniq_ptrs[i], uniq_ptrs[indices[const_ptrs[i]]]);
}
但我希望有一种更好的方法,它不涉及临时向量、哈希映射和两次遍历数据。
【问题讨论】:
-
辅助结构为您提供了重新排列的线性复杂性。没有它,您需要更频繁地遍历范围。
-
既然你只是在处理指针,你能不能不创建一个新的vector<:unique_ptr>> 循环遍历vector
const_ptrs. -
@jayadev,我将不得不通过强制转换来消除常量。
-
您的就地版本看起来完全有缺陷,确定没有错别字吗?
-
@brunocodutra,是的 - 我修好了。
标签: c++ c++11 vector stl unique-ptr