Std::set::find与Std::find在Std::set上使用const
std::set::find vs std::find on std::set with const
我写了一点(工作)测试代码,但我不明白为什么在test1
函数中,我只能传递int* const
作为参数,而在test2
函数中,我可以传递const int*
。如果我将const int*
传递给test1
,我会得到一个丢弃限定符错误。
在我的研究中,我发现std::find
和set::find
都有一个const版本,所以我看不出为什么它们的行为不同。我也尝试了boost::container::flat_set
而不是std::set
,我得到了同样的结果。有人能解释一下吗?
class myClass
{
public:
myClass() {};
~myClass() {};
void add(int* ref)
{
this->_ref.insert(ref);
};
bool test1(int* const ref) const
{
return ( this->_ref.find(ref) != this->_ref.end() );
}
inline
bool test2(const int* ref) const
{
return ( std::find(this->_ref.begin(), this->_ref.end(), ref) != this->_ref.end() );
}
std::set<int*> _ref;
};
int main()
{
myClass test;
test.add(new int(18));
test.add(new int(35));
test.add(new int(78));
test.add(new int(156));
std::cout<<test.test1(0)<<std::endl;
std::cout<<test.test1(*test._ref.begin())<<std::endl;
std::cout<<test.test2(0)<<std::endl;
std::cout<<test.test2(*test._ref.begin())<<std::endl;
return 0;
}
set::find()
给出的答案是O(logN), std::find()
给出的答案是O(N)。
同理,map::find()
给出的答案是O(logN), std::find()
给出的答案是O(N)。
容器std::set<int*>
只有同构查找,因此您只能通过与相同类型的值进行比较来搜索键:find
, count
, erase
。当然,const int*
类型的值与int*
类型不同,因此您的test2
代码尝试将前者转换为后者,这是不允许的转换。
容器只能以这样的同构方式使用,这是c++从一开始就存在的一个缺点,更令人吃惊的不希望转换的例子是,当您有一个具有std::string
键的映射,并且想要查找一个键作为字符串字面量提供的元素时。您总是必须构造动态std::string
对象,即使std::string
提供了带有字符串字面值的比较操作符。
因此,从c++ 14开始,您还可以通过拼写std::set<int*, std::less<>>
来创建非同构查找的set(或map)。有了这样的容器,循环函数就变成了模板,您确实可以比较不同类型的值(将转换逻辑留给底层的<
-操作符)。但是请注意,std::less<int*>
需要在指针上提供严格的弱排序,而std::less<>
没有,所以你可能会得到未定义的行为。
- std::find,返回所有找到的值的替代方法,而不仅仅是存在重复的向量的第一个值
- 为什么在向量上使用 std::find() 时会出现错误?
- 使用 std::find 时没有匹配的函数调用错误
- STL std::find() C++
- 如何将 std::find() 与 2d std: 数组一起使用?
- 如果迭代器没有因插入而无效,则使用std::find和C::insert()是线程安全的
- 未按值排序的std::find和std::any_of
- 在libc++和libstdc++之间的std::map上使用std::find时的实现差异
- 有没有办法在Cython中导入std::find find_if等?
- 由 std::find() 返回的迭代器不可取消引用
- C++ std::find() 寻址返回向量的类函数时的意外行为
- 在 std::find 中使用来自不同命名空间的运算符
- 使用 std::find 和用户提供的谓词 - 自制的 find() 重载
- 如何使用 std::find 找到元素的所有位置?
- 使用带有反向迭代器的std :: find()
- C++ STL: std::find with std::map
- std::find是否隐式修复无效参数
- 如何在 std::vector 内的自定义对象上使用 std::find
- std::find on empty vector 是否会导致未定义的行为
- 使用 std::find 在向量中定位随机生成的数字