Questions tagged «stl»

标准模板库(STL)是包含通用容器,迭代器,算法和函数对象的C ++库。当C ++标准化时,STL的大部分被标准库所采用,并且标准库中的这些部分有时也被错误地统称为“ STL”。

10
不区分大小写的std :: string.find()
我正在使用std::string的find()方法来测试字符串是否是另一个的子字符串。现在,我需要相同内容的不区分大小写的版本。对于字符串比较,我总是可以转向,stricmp()但似乎没有stristr()。 我已经找到了各种答案,并且大多数建议Boost在我的情况下不能选择使用哪个答案。另外,我需要支持std::wstring/ wchar_t。有任何想法吗?



8
Google C ++样式指南的无例外规则;STL?
Google的C ++风格指南说“我们不使用例外”。该样式在异常使用方面未提及STL。由于STL分配器可能会失败,因此它们如何处理容器引发的异常? 如果他们使用STL,如何将分配失败通知呼叫者?STL方法(例如push_back()或map)operator[]不会返回任何状态代码。 如果他们不使用STL,则使用什么容器实现?
68 c++  exception  stl 

4
具有特定类型作为通用参数的STL容器
有什么办法可以使函数将具有特定类型(让我们说std::string)的容器作为参数? void foo(const std::container<std::string> &cont) { for(std::string val: cont) { std::cout << val << std::endl; } } 并为每种类型的stl容器调用它作为输入?喜欢上面吗? std::set<std::string> strset; std::vector<std::string> strvec; std::list<std::string> strlist; foo(strset); foo(strvec); foo(strlist);

4
将std :: transform与std :: back_inserter一起使用是否有效?
Cppreference具有以下示例代码std::transform: std::vector<std::size_t> ordinals; std::transform(s.begin(), s.end(), std::back_inserter(ordinals), [](unsigned char c) -> std::size_t { return c; }); 但这也说: std::transform不保证unary_op或的顺序应用binary_op。要将功能按顺序应用于序列或将功能修改序列的元素,请使用std::for_each。 大概是为了允许并行实现。但是,第三个参数std::transform是a LegacyOutputIterator,它具有以下条件++r: 此操作之后,r不需要是可递增的,并且r不再需要先前值的任何副本是可取消引用或可递增的。 因此在我看来,输出的分配必须按顺序进行。它们是否仅表示的应用程序unary_op可能会乱序,并存储到一个临时位置,但按顺序复制到输出中?这听起来不像您想做的事情。 大多数C ++库实际上尚未实现并行执行程序,但Microsoft已实现。我很确定这是相关的代码,并且我认为它调用此populate()函数来将迭代器记录到输出的大块中,这肯定不是一件有效的事情,因为 LegacyOutputIterator可以通过递增其副本来使其无效。 我想念什么?

3
确定最便宜参数类型的编译时方法
我有一个看起来像这样的模板 template <typename T> class Foo { public: Foo(const T& t) : _t(t) {} private: const T _t; }; 有一种精明的模板元编程方法可以避免在参数类型像布尔值或char这样琐碎的情况下使用const引用吗?喜欢: Foo(stl::smarter_argument<T>::type t) : _t(t) {}
15 c++  stl 

2
向量作为键在C ++内部如何工作?
该SO回答说,带有向量作为密钥的STL映射,该向量可用作密钥。因此,当我们使用向量作为键时。由于键需要唯一,因此该键实际如何工作,因此当我们插入具有相同元素的另一个向量时,将map检查逐个元素重复还是向量名称确实指定了某些东西?就像数组的名称代表基地址一样。因此,可以将数组用作键,因为在这种情况下基地址可以用作键,但是在向量的情况下,键是什么。它是如何在内部工作的。 因为当我打印矢量的名称时,我确实得到了一个错误 vector<int> v; cout<<v; //error
14 c++  arrays  dictionary  vector  stl 

1
是string.assign(string.data(),5)定义明确的还是UB?
一位同事想这样写: std::string_view strip_whitespace(std::string_view sv); std::string line = "hello "; line = strip_whitespace(line); 我说过归来string_view使我先天不安,而且,在我看来,这里的别名看起来像UB。 我可以肯定地说line = strip_whitespace(line)在这种情况下等于line = std::string_view(line.data(), 5)。我相信will call string::operator=(const T&) [with T=string_view],其定义为等同于line.assign(const T&) [with T=string_view],其定义为等同于line.assign(line.data(), 5),定义为执行此操作: Preconditions: [s, s + n) is a valid range. Effects: Replaces the string controlled by *this with a copy of the range …

3
我可以在并行执行策略中使用std :: transform吗?
如果我没有记错的话,我可以std::transform执行到位 ,通过使用同一范围内的输入和输出迭代器。假设我有一些std::vector对象vec,那么我会写 std::transform(vec.cbegin(),vec.cend(),vec.begin(),unary_op) 使用合适的一元运算unary_op。 使用C ++ 17标准,我想通过std::execution::par在其中插入第一个参数来并行执行转换。这会使该函数从上cppreference文章std::transform中的重载(1)变为(2)。但是,对此超载的注释说: unary_op[...]不得使任何迭代器(包括最终迭代器)无效,或修改所涉及范围的任何元素。(自C ++ 11起) “修改任何元素”真的意味着我无法就地使用算法,还是在谈论我误解的其他细节?

1
在使用GCC的unordered_map :: insert KeyEqual异常期间发生内存泄漏-破坏了强有力的异常安全保证吗?
我正在使用GCC 7.3.1,但也在coliru(我相信它是9.2.0版)上进行了测试。使用以下内容进行构建: g++ -fsanitize=address -fno-omit-frame-pointer rai.cpp 这里是rai.cpp: #include <iostream> #include <unordered_map> int main() { try { struct MyComp { bool operator()(const std::string&, const std::string&) const { throw std::runtime_error("Nonono"); } }; std::unordered_map<std::string, std::string, std::hash<std::string>, MyComp> mymap; mymap.insert(std::make_pair("Hello", "There")); mymap.insert(std::make_pair("Hello", "There")); // Hash match forces compare } catch (const std::exception& e) { …
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.