如何在保持顺序的同时有效地将列表插入到排序向量中?

时间:2017-02-27 17:17:30

标签: c++ concatenation stl-algorithm

我想将STL列表的内容插入到现有的向量中,以便在插入后仍然对向量进行排序。

以下是我试图有效地执行此操作的代码。虽然它会起作用,但我相信应该有更好的连接方式。

Vector func textFieldDidEndEditing(_ textField: UITextField) { textField.layoutIfNeeded() //Fixes iOS 9 text bounce glitch //...other stuff } 在描述合并操作之前确实有一些元素。

V

如果此信息有帮助了。

Size(V) > Size(L)

代码需要在C ++ 14中。

2 个答案:

答案 0 :(得分:2)

您可以使用vector::insert轻松完成此操作,但我不相信该实现可以有效地与两个双向迭代器保持距离,因此您可能希望保留空间以避免不需要的向量调整大小。至少从C ++ 11开始,list::size似乎必须是恒定时间,所以如果你至少在那个版本上,你可以预先保留足够的空间。否则,因为您知道V大于L,只需V之前insert的容量加倍:

V.reserve(V.size() + L.size());
V.insert(V.end(), L.begin(), L.end());

答案 1 :(得分:2)

假设您的矢量已经排序并且要保持排序,请执行以下操作:

void merge(std::list<int> const& L, std::vector<int>& V) {
  auto old_end = V.size();
  V.insert( V.end(), L.begin(), L.end() );
  std::sort( V.begin()+old_end, V.end() );
  std::inplace_merge( V.begin(), V.begin()+old_end, V.end() );
}

可能相对最佳。 (注意inplace_merge可能会分配,因此这可能不像人们希望的那样最佳)

.insert可以保留空间,最多只能重新分配一次。

接下来,我们只对列表中的元素进行排序,然后我们进行就地合并以将其与向量前面的先前排序的元素合并。

我还将list设为const&,因为我们没有对其进行修改。