关联容器,比较函数不是元素类型的一部分吗?
Associative containers, is the comparison function not part of element type?
我认为,可以传递给关联容器模板(如std::set
或std::multiset
)的比较函数不是实例化容器类型实际element type
的一部分吗?
#include <iostream>
#include <set>
#include "Sales_data_ex1119.hpp"
using namespace std;
bool compare_isbn(const Sales_data& lhs, const Sales_data& rhs) {
return lhs.isbn() < rhs.isbn();
}
int main() {
using cmp_func = bool (*)(const Sales_data& lhs, const Sales_data& rhs);
multiset<Sales_data, cmp_func> bookstore(&compare_isbn);
Sales_data foo("978", 2, 22.22);
Sales_data foo2("978", 2, 22.22);
Sales_data bar("979", 3, 22.22);
Sales_data baz("980", 2, 22.22);
bookstore.insert(foo);
bookstore.insert(foo2);
bookstore.insert(bar);
bookstore.insert(baz);
// comparsion function is not part of element type?
multiset<Sales_data>::iterator it = bookstore.begin();
while (it != bookstore.end()) {
print(cout, *it++);
cout << "n";
}
cout << "n";
// but the comparsion function can be applied also
multiset<Sales_data, cmp_func>::iterator it2 = bookstore.begin();
while (it2 != bookstore.end()) {
print(cout, *it2++);
cout << "n";
}
return 0;
}
it
和it2
这两个定义都可以在GCC 7中编译和运行良好。这对我来说是有道理的,key_type
被定义为Sales_data
,std::set
和std::multiset
的key_type
是element type
.
如果看到很多人在定义中使用比较函数,这可能只是更明确但不是必需的。
谢谢
我认为,可以传递给关联容器模板(如 std::set 或 std::multiset)的比较函数不是实例化容器类型的实际元素类型的一部分?
迭代器进入multiset<Key,Compare,Allocator>
的唯一完全可靠的类型是multiset<Key,Compare,Allocator>::iterator
。
现在,因为多集中的每个节点实际上都不需要排序顺序或分配器来完成它的工作,并且因为库编写者更喜欢避免重复,所以很有可能在你的标准库中的某个地方有一个迭代器类模板,该模板在所有(multi)(set|map)类之间共享, 这仅取决于元素类型。
但如果是这种情况,它是一个实现细节,是不可移植的,并且可能会发生变化。所以,这个:
multiset<Sales_data, cmp_func> bookstore(&compare_isbn);
multiset<Sales_data>::iterator it = bookstore.begin();
目前可能很有效。但是另一个编译器或库实现拒绝它是完全合法的。
无论如何,即使不包括比较(和分配器!)类型参数,写出整个事情也是非常乏味的。只需使用
auto it = bookstore.begin()
忘记整件事。或者,更好的是:
for (auto &sale : bookstore) {
或者,在特定情况下,编写流插入运算符并使用
copy(begin(bookstore), end(bookstore),
ostream_iterator<Sales_data>(cout, "n"));
相关文章:
- 在C++中,如何通过几种类型从元组中选择多个元素
- 如何为 c++ 的不同变量类型的结构元素创建动态数组?
- 在 C++ 中输出枚举类类型的向量元素
- C++默认情况下,指针类型数组的元素是否保证初始化为 nullptr?
- 如何使用模板根据类型将元素添加到各种容器中
- C++ 未初始化的本地(非全局)int 数组中的元素类型到底是什么?
- OpenCV C++:当垫子类型未知时无法访问垫子元素?
- C++如何乘以包含 std::variant 元素的向量的迭代器?正在执行迭代器类型的转换?
- C++:是否可以编写一个函数,将不同类型的元素附加到变体数组中?
- C++通过别名指针以静默方式将错误的类型分配给数组元素
- 我无法在用forward_as_tuple创建的元组中按类型访问元素
- 如何告诉自动推断向量<bool>元素的非引用类型
- 为什么将函数的返回类型从结构节点*更改为void后,链表的元素没有显示create_ll和显示?
- 如何为基类通用类型创建向量以使用具体类型元素
- 按索引将类类型元素从一个向量复制到另一个 c++
- 如何实现数据结构,就像C 中的数组一样支持不同的类型元素
- 如何在构造具有不同类型元素的向量副本时显式转换
- 处理特定类型元素的任何容器的非模板函数
- *类型元素容器的qt排序
- 如何将两个双数据类型元素转换为一个Point数据类型