在 C++ 标准库中,std::vector
和 std::map
都支持以下比较运算符:
==
(相等运算符)!=
(不等运算符)<
(小于运算符)<=
(小于等于运算符)>
(大于运算符)>=
(大于等于运算符)
1. std::vector
的比较
对于 std::vector
,这些运算符通过词典序比较(lexicographical comparison)进行。词典序比较类似于字符串的字母顺序,比较规则如下:
- 从
vector
的头开始,依次比较每个元素。 - 如果两个向量的元素都相等,则继续比较下一个元素。
- 如果找到了一个不相等的元素,直接根据这个元素的大小来决定结果。
- 如果比较到最后所有的元素都相等,但一个向量比另一个短,那么较短的向量视为“更小”。
例子:
#include <iostream>
#include <vector>
int main() {
std::vector<int> v1 = {1, 2, 3};
std::vector<int> v2 = {1, 2, 4};
if (v1 < v2) {
std::cout << "v1 < v2" << std::endl; // 会输出,因为 3 < 4
}
if (v1 != v2) {
std::cout << "v1 != v2" << std::endl; // 会输出,因为第3个元素不同
}
return 0;
}
2. std::map
的比较
std::map
也是按词典序进行比较的,但它的比较基于键值对的顺序,而不是单独的键或值。std::map
是按照键进行排序的,因此比较时也遵循键的顺序,比较规则如下:
- 首先按键进行比较,比较每个键是否相等。
- 如果键相等,则进一步比较键对应的值。
- 如果找到一个不相等的键,或一个相等的键其值不相等,直接根据这个结果返回比较值。
- 如果所有键值对都相等,则视为相等。
例子:
#include <iostream>
#include <map>
int main() {
std::map<int, std::string> map1 = {{1, "apple"}, {2, "banana"}};
std::map<int, std::string> map2 = {{1, "apple"}, {2, "carrot"}};
if (map1 < map2) {
std::cout << "map1 < map2" << std::endl; // 会输出,因为 "banana" < "carrot"
}
if (map1 != map2) {
std::cout << "map1 != map2" << std::endl; // 会输出,因为键 2 对应的值不同
}
return 0;
}
3. 比较运算符的适用条件
std::vector
和std::map
的比较运算符依赖于容器中元素或键、值的类型。如果元素或键、值的类型支持这些比较运算符,那么std::vector
和std::map
的比较运算符就可以工作。例如,如果std::vector
中的元素类型是用户自定义的类型,且这个类型没有定义比较运算符,编译器就会报错。
4. 小结
std::vector
和std::map
都支持<
,>
,<=
,>=
,==
,!=
这些比较运算符,并且都是按词典序进行比较。- 这些运算符的前提是,存储在
vector
和map
中的类型(如元素、键和值)支持相应的比较运算符。