Questions tagged «stl»

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


6
为什么可以从函数中返回“向量”?
请考虑此代码。我已经看过几次这种类型的代码。words是局部向量。如何从函数返回它? 我们可以保证它不会死吗? std::vector<std::string> read_file(const std::string& path) { std::ifstream file("E:\\names.txt"); if (!file.is_open()) { std::cerr << "Unable to open file" << "\n"; std::exit(-1); } std::vector<string> words;//this vector will be returned std::string token; while (std::getline(file, token, ',')) { words.push_back(token); } return words; }

9
在哪里可以获得“有用的” C ++二进制搜索算法?
我需要一个与C ++ STL容器兼容的二进制搜索算法,就像std::binary_search在标准库的<algorithm>标头中一样,但是我需要它返回指向结果的迭代器,而不是简单的布尔值告诉我元素是否存在。 (附带说明,标准委员会在为binary_search定义API时到底在想什么?!) 我主要关心的是我需要二进制搜索的速度,因此,尽管可以使用其他算法查找数据,如下所述,但我想利用这样一个事实,即我的数据经过排序以获得二进制的好处搜索,而不是线性搜索。 到目前为止lower_bound,upper_bound如果缺少基准点则失败: //lousy pseudo code vector(1,2,3,4,6,7,8,9,0) //notice no 5 iter = lower_bound_or_upper_bound(start,end,5) iter != 5 && iter !=end //not returning end as usual, instead it'll return 4 or 6 注意:只要与容器兼容,我也可以使用不属于std名称空间的算法。就像说boost::binary_search。


5
使用自定义的std :: set比较器
Наэтотвопросестьответына 堆栈溢出нарусском:Компаратордля集 我试图将一组整数中的项目的默认顺序更改为字典式而不是数字式,并且无法使用g ++进行以下编译: file.cpp: bool lex_compare(const int64_t &a, const int64_t &b) { stringstream s1,s2; s1 << a; s2 << b; return s1.str() < s2.str(); } void foo() { set<int64_t, lex_compare> s; s.insert(1); ... } 我收到以下错误: error: type/value mismatch at argument 2 in template parameter list for ‘template<class _Key, class …
105 c++  stl 

10
为什么std :: set没有“包含”成员函数?
我使用率很高std::set<int>,通常只需要检查这样的集合是否包含数字即可。 我觉得写自然: if (myset.contains(number)) ... 但是由于缺少contains成员,我需要编写繁琐的代码: if (myset.find(number) != myset.end()) .. 还是不太明显: if (myset.count(element) > 0) .. 这个设计决定有理由吗?
103 c++  stl  stdset 


6
字符串c_str()与data()
我看了几个地方那之间的区别c_str(),并data()(在STL和其他实现)是c_str()始终是NULL终止,而data()不是。据我在实际实现中看到的,它们要么执行相同的操作,要么data()调用c_str()。 我在这里想念什么?在哪种情况下使用哪个更正确?
102 c++  stl  c-str 

6
过滤STL容器的现代方法?
在使用了C#多年之后,我又回到C ++了,我想知道现代的方式-阅读:C ++ 11-筛选数组的方式,即如何实现类似于此Linq查询的内容: var filteredElements = elements.Where(elm => elm.filterProperty == true); 为了过滤元素向量(strings出于这个问题)? 我衷心希望现在已取代需要定义显式方法的旧STL样式算法(甚至是扩展boost::filter_iterator)。
102 c++  c++11  stl 

5
从向量中删除元素
我想使用擦除方法从向量中清除元素。但是这里的问题是不能保证元素在向量中仅出现一次。它可能存在多次,我需要清除所有这些。我的代码是这样的: void erase(std::vector<int>& myNumbers_in, int number_in) { std::vector<int>::iterator iter = myNumbers_in.begin(); std::vector<int>::iterator endIter = myNumbers_in.end(); for(; iter != endIter; ++iter) { if(*iter == number_in) { myNumbers_in.erase(iter); } } } int main(int argc, char* argv[]) { std::vector<int> myNmbers; for(int i = 0; i < 2; ++i) { myNmbers.push_back(i); myNmbers.push_back(i); } erase(myNmbers, …
101 c++  vector  stl  erase 

3
gcc std :: unordered_map实现慢吗?如果是这样-为什么?
我们正在用C ++开发高性能的关键软件。在那里,我们需要一个并发的哈希映射并实现一个。因此,我们编写了一个基准来确定与并发哈希图相比要慢多少std::unordered_map。 但是,这std::unordered_map似乎太慢了……所以这是我们的微基准测试(对于并发映射,我们产生了一个新线程,以确保不会对锁定进行优化,并且请注意,我从不插入0,因为我也使用进行了基准测试google::dense_hash_map,需要一个空值): boost::random::mt19937 rng; boost::random::uniform_int_distribution<> dist(std::numeric_limits<uint64_t>::min(), std::numeric_limits<uint64_t>::max()); std::vector<uint64_t> vec(SIZE); for (int i = 0; i < SIZE; ++i) { uint64_t val = 0; while (val == 0) { val = dist(rng); } vec[i] = val; } std::unordered_map<int, long double> map; auto begin = std::chrono::high_resolution_clock::now(); for (int i = 0; …

4
C ++ const映射元素访问
我尝试使用operator []访问const C ++映射中的元素,但是此方法失败。我也尝试使用“ at()”来做同样的事情。这次成功了。但是,我找不到有关使用“ at()”访问const C ++映射中的元素的任何参考。“ at()”是C ++映射中的新增功能吗?在哪里可以找到更多有关此的信息?非常感谢你! 示例如下: #include <iostream> #include <map> using namespace std; int main() { map<int, char> A; A[1] = 'b'; A[3] = 'c'; const map<int, char> B = A; cout << B.at(3) << endl; // it works cout << B[3] << endl; // …
100 c++  stl  map  const 

2
为什么C ++ 20中引入了std :: ssize()?
C ++ 20引入了以下std::ssize()免费功能: template <class C> constexpr auto ssize(const C& c) -> std::common_type_t<std::ptrdiff_t, std::make_signed_t<decltype(c.size())>>; 似乎可以使用实现static_cast,将size()cl ass C的成员函数的返回值转换为其有符号的对等。 由于size()C 的成员函数始终返回非负值,所以为什么有人要将它们存储在带符号的变量中?万一真的要,那很简单static_cast。 为什么std::ssize()在C ++ 20中引入?
99 c++  stl  unsigned  signed  c++20 

6
为什么vector <bool>不是STL容器?
斯科特·迈耶斯(Scott Meyers)的书《有效的STL:提高标准模板库使用率的50种特定方法》第18条说,要避免vector &lt;bool&gt;使用它,因为它不是STL容器,并且实际上并不适用bool。 如下代码: vector &lt;bool&gt; v; bool *pb =&amp;v[0]; 不会编译,这违反了STL容器的要求。 错误: cannot convert 'std::vector&lt;bool&gt;::reference* {aka std::_Bit_reference*}' to 'bool*' in initialization vector&lt;T&gt;::operator []返回类型应该是T&amp;,但是为什么会有特殊情况vector&lt;bool&gt;呢? 什么是vector&lt;bool&gt;真正组成的呢? 该项目还说: deque&lt;bool&gt; v; // is a STL container and it really contains bools 可以代替vector&lt;bool&gt;吗? 谁能解释一下?


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.