gpt4 book ai didi

c++ - 迭代器是否需要按照标准包含来自容器的任何类型信息?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:35:13 26 4
gpt4 key购买 nike

今天我遇到了this问题并开始怀疑 gcc/clang 和 Visual Studio 之间的不一致。

这个问题本身很笼统,但我仍然想了解 - 标准是否对迭代器类型是否应该包含任何容器特定类型信息强加了任何规则。考虑这个片段:

#include <unordered_map>
#include <iostream>

struct hash1
{
size_t operator()(int key) const
{
return key;
}
};

struct hash2
{
size_t operator()(int key) const
{
return key + 1;
}

};

int main(int argc, char** argv)
{
std::unordered_map<int, int, hash1> map1;
map1[1] = 1;
std::unordered_map<int, int, hash2> map2;
map2[1] = 1;
std::unordered_map<int, int, hash2>::iterator it1 = map1.find(1);
std::unordered_map<int, int, hash2>::iterator it2 = map2.find(1);
if (it1 == it2) // Visual Studio 2015 Gives an assertion on iterator type inequality
{
std::cout << "equal";
}
else
{
std::cout << "not equal";
}
}

因此在 Visual Studio 中,std::unordered_set 迭代器类型只是一个 std::list 迭代器,它当然不知道任何有关哈希函数类型的信息,并且因此我可以执行赋值,但是相等运算符给出断言,因为它在内部比较容器。另一方面,GCC/clang 也忽略了类型不兼容,但也没有运行时警告/错误。

标准对这个主题有何看法?

最佳答案

一对迭代器描述了值的序列。如果您尝试使用两个不指向同一序列元素的迭代器执行某些操作,则您的程序的行为是未定义的,即,标准不会对程序的行为强加任何要求。

请注意,上一段没有在任何地方使用“容器”一词。容器是创建序列的一种方式,但不是唯一的方式。所以,不,没有要求迭代器知道容器,因为迭代器与容器没有内在联系。

关于c++ - 迭代器是否需要按照标准包含来自容器的任何类型信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36056202/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com