我可以让 std::list 按顺序插入新元素吗?或者必须使用std::sort
can I make std::list insert new elements with order ? or got to use std::sort?
如果我想使用std::list
并且插入到列表中的新元素将插入到相对于比较函数的正确位置 - 我可以做到吗?或者我必须在每次插入后使用 std::sort?
您可以使用:
- std::set 如果你的元素是不可变的
- std::map 如果您的元素具有不可变键,但应该具有可变值
- std::列出并查找插入位置
std::list with std::lower_bound:
#include <algorithm>
#include <list>
#include <iostream>
int main()
{
std::list<int> list;
int values[] = { 7, 2, 5,3, 1, 6, 4};
for(auto i : values)
list.insert(std::lower_bound(list.begin(), list.end(), i), i);
for(auto i : list)
std::cout << i;
std::cout << 'n';
}
或者,您可以填充整个 std::vector 并在之后对其进行排序(注意:std::sort 不能在 std::list::迭代器上运行,它们不提供随机访问):
#include <algorithm>
#include <vector>
#include <iostream>
int main()
{
std::vector<int> vector = { 7, 2, 5,3, 1, 6, 4};
std::sort(vector.begin(), vector.end());
for(auto i : vector)
std::cout << i;
std::cout << 'n';
}
注意:手动查找插入位置的列表的性能最差 O(N²)。
是的,你可以。尝试如下操作,如果需要,只需更改比较功能和类型即可。
#include <list>
inline
int compare(int& a, int&b) {
return a - b;
}
template<typename T>
void insert_in_order(std::list<T>& my_list, T element, int (*compare)(T& a, T&b)) {
auto begin = my_list.begin();
auto end = my_list.end();
while ( (begin != end) &&
( compare(*begin,element) < 0 ) ) {
++begin;
}
my_list.insert(begin, element);
}
int main() {
std::list<int> my_list = { 5,3,2,1 };
my_list.sort(); //list == { 1,2,3,5}
insert_in_order<int>(my_list, 4, &compare); //list == {1,2,3,4,5}
}
您有三个选择:
- 每次插入后排序
- 找到正确的索引并在该索引处插入
- 使用 std::set (推荐)
第三个选项的示例:
#include <iostream>
#include <set>
int main ()
{
int myints[] = {75,23,65,42,13};
std::set<int> myset (myints,myints+5);
std::cout << "myset contains:";
for (std::set<int>::iterator it=myset.begin(); it!=myset.end(); ++it)
std::cout << ' ' << *it;
std::cout << 'n';
return 0;
}
输出:
MySet 包含: 13 23 42 65 75
相关文章:
- 错误 C2679:二进制"<<":未找到采用类型 'std::string_view' 的右侧操作数的运算符(或者没有可接受的转换)
- 比较两个std::矢量/阵列,或者通常比较两个stl连续器
- 错误:C2679 二进制"==":未找到采用类型 'const std::string' 的右侧操作数的运算符(或者没有可接受的转换)
- 非阻塞pthread停止-或者为什么std::atomic_flag会减慢我的代码
- std::cout在编译时等效,或者在c++11中编译时常数值的static_assert字符串化
- Qt:将QPixmap保存到std::vector<无符号字符>-或者将QByteArray转换为std::
- 为什么 std::vector 这么快(或者我的实现太慢了)
- 我可以让 std::list 按顺序插入新元素吗?或者必须使用std::sort
- 当 std::fprintf(stderr,..) 失败时,操作是否不起作用,或者可以在失败之前写入一点
- 我可以将 std::数组转换为切片吗?或者我还能用什么
- 在这种情况下可以使用std::array(或boost::array)吗?或者我是不是一直使用std::vector和本
- 我是否应该复制std::函数,或者我可以总是引用它
- std::vector *必须*在增加容量时移动对象吗?或者,分配器可以"reallocate"吗?
- 如何' std::initializer_list '值通过编译器?(或者:我怎样才能避免一个普遍的超载?)
- 错误 C++ 2679(二进制">>":未找到采用类型 'const std::string' 的右侧操作数的运算符(或者没有可接受的转换))
- 实现std::变量转换构造函数-或者:如何从参数包中找到从任何T到Ti的所有转换的第一个重载
- std:vector<char[30]>有效,或者如何实现这一点?(固定大小数组的向量?
- 错误 C2679:二进制'<<':未找到采用类型 'std::string' 的右侧操作数的运算符(或者没有可接受的转换)
- std::chrono::...::time_point上的构造函数应该不是例外吗?(或者为什么不是?
- 为什么 std::noskipws 不起作用,或者它应该做什么?