Questions tagged «c++-standard-library»

在C ++编程语言中,C ++标准库是类和函数的集合,这些类和函数可以用也可以不用核心语言编写,并且是C ++的一部分

2
为什么对于许多标准库类型在C ++ 20中删除了operator!=?
根据cppreference,std::type_info::operator!=被C ++ 20删除,但是std::type_info::operator==显然仍然存在。 背后的原因是什么?我可能同意比较不平等是没有意义的,但是比较相等也同样是没有意义的,不是吗? 同样,operator!=在许多其他标准库类型中,包括容器,例如std::unordered_map::operator!=和,std::unordered_set::operator!=将根据cppreference在C ++ 20中将其删除。 相比之下,必须编写if(!(id1 == id2))并不会使任何代码更清晰if(id1 != id2),相反,相反……


2
为什么`std :: string :: find()`在失败时不返回结束迭代器?
我发现的行为std::string::find与标准C ++容器不一致。 例如 std::map<int, int> myMap = {{1, 2}}; auto it = myMap.find(10); // it == myMap.end() 但是对于一串, std::string myStr = "hello"; auto it = myStr.find('!'); // it == std::string::npos 为什么不应该失败的myStr.find('!')回报myStr.end(),而不是std::string::npos? 由于std::string与其他容器相比,它有些特殊,所以我想知道这背后是否有真正的原因。(令人惊讶的是,我找不到任何人在任何地方对此进行质疑)。

2
GCC9是否避免了std :: variant的无值状态?
我最近关注了Reddit的讨论,该讨论使std::visit编译器之间的优化有了很好的比较。我注意到以下内容:https : //godbolt.org/z/D2Q5ED 当所有类型都满足某些条件时,GCC9和Clang9(我猜它们共享相同的stdlib)都不会生成用于检查并抛出无值异常的代码。这导致更好的代码生成方式,因此我提出了MSVC STL的问题,并向其提供了以下代码: template <class T> struct valueless_hack { struct tag {}; operator T() const { throw tag{}; } }; template<class First, class... Rest> void make_valueless(std::variant<First, Rest...>& v) { try { v.emplace<0>(valueless_hack<First>()); } catch(typename valueless_hack<First>::tag const&) {} } 声称是,这使得任何变体都没有价值,并且阅读文档应该: 首先,销毁当前包含的值(如果有)。然后直接初始化包含的值,就像T_I使用参数构造类型的值一样。如果std::forward<Args>(args)....引发异常,则*this可能变为valueless_by_exception。 我不明白的是:为什么将其表示为“可能”?如果整个操作失败,保持旧状态合法吗?因为这是GCC的工作: // For suitably-small, trivially copyable types we …

1
如何在C ++ 20中实现shift_right()?
在C ++ 20中,<algorithm>标头获得了两个新算法:shift_left()和shift_right()。他们两个都接受任何LegacyForwardIterator。对于shift_left(),指定了``移动i从​0'' 开始以递增顺序执行; 对于shift_right(),指定为“如果ForwardIt满足LegacyBidirectionalIterator要求,则以i从开始的降序执行移动last - first - n - 1。” 我可以想到一种相当容易实现的方法shift_left(): template <typename ForwardIt> constexpr inline ForwardIt shift_left(ForwardIt first, ForwardIt last, typename std::iterator_traits<ForwardIt>::difference_type n) { if (n <= 0) return last; ForwardIt it = first; for (; n > 0; --n, ++it) { if (it == last) return first; …

1
比较std :: string和C样式的字符串文字
假设我有以下代码: #include <iostream> #include <string> #include <iomanip> using namespace std; // or std:: int main() { string s1{ "Apple" }; cout << boolalpha; cout << (s1 == "Apple") << endl; //true } 我的问题是:系统如何在这两者之间进行检查?s1是一个对象,同时"Apple"是C样式的字符串文字。 据我所知,无法比较不同的数据类型。我在这里想念什么?
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.