我想将STL列表的内容插入到现有的向量中,以便在插入后仍然对向量进行排序。
以下是我试图有效地执行此操作的代码。虽然它会起作用,但我相信应该有更好的连接方式。
Vector func textFieldDidEndEditing(_ textField: UITextField) {
textField.layoutIfNeeded() //Fixes iOS 9 text bounce glitch
//...other stuff
}
在描述合并操作之前确实有一些元素。
V
如果此信息有帮助了。
Size(V) > Size(L)
代码需要在C ++ 14中。
答案 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&
,因为我们没有对其进行修改。