Tag: stl

在编译时确定types是否是STL容器

我想编写一个模板来确定一个types在编译时是否是一个stl容器。 我有以下一些代码: struct is_cont{}; struct not_cont{}; template <typename T> struct is_cont { typedef not_cont result_t; }; 但我不知道如何为std::vector<T,Alloc>, deque<T,Alloc>, set<T,Alloc,Comp>等创build必要的特化。

使用函数指针的STL映射

我开发了一个拥有许多内置函数的脚本引擎,所以要调用任何函数,我的代码就进入了if .. else if .. else if检查名称的墙,但我想开发一个更有效的解决scheme。 我应该使用散列表与string作为键和指针作为值? 我怎么能通过使用STL地图呢? 编辑 :进入我的脑海的另一点:当然使用地图将强制编译器不内联函数,但我低效率的方法没有任何开销产生的function调用的必要性,它只是执行代码。 所以我想知道函数调用产生的开销是否会比使用if..else链更好。否则,我可以通过在运行时检查一个字符来最小化比较次数(将会更长但更快)。

我在哪里可以得到一个“有用的”C ++二进制searchalgorithm?

我需要一个与C ++ STL容器兼容的二进制searchalgorithm,就像标准库的<algorithm>标题中的std::binary_search ,但是我需要它返回指向结果的迭代器,而不是一个简单的布尔值来告诉我如果元素存在。 (在旁注中,当他们为binary_search定义API时,标准委员会在想什么?) 我主要关心的是,我需要二进制search的速度,所以虽然我可以用其他algorithmfind数据,但是我想利用这个事实:我的数据被sorting以获得二进制的好处search,而不是一个线性search。 到目前为止,如果数据丢失, 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命名空间的algorithm。 就像boost::binary_search 。

为什么vector <bool>不是STL容器?

斯科特·迈耶斯(Scott Meyers)的书“ 有效的STL”第18条:改善标准模板库的使用的50个具体方法是为了避免vector <bool>因为它不是一个STL容器,它并不真正成为bools。 以下代码: vector <bool> v; bool *pb =&v[0]; 不会编译,违反了STL容器的要求。 错误: cannot convert 'std::vector<bool>::reference* {aka std::_Bit_reference*}' to 'bool*' in initialization vector<T>::operator []返回types应该是T&,但为什么它是vector<bool>的特殊情况? vector<bool>真的包含了什么? 该项目进一步说: deque<bool> v; // is a STL container and it really contains bools 这可以用作vector<bool>的替代方法吗? 谁能解释一下吗?

如何通过索引擦除std :: vector <>中的元素?

我有一个std :: vector <int>,我想删除第n个元素。 我怎么做? std::vector<int> vec; vec.push_back(6); vec.push_back(-17); vec.push_back(12); vec.erase(???);

迭代std :: vector:unsigned与有符号的索引variables

在C ++中迭代一个向量的正确方法是什么? 考虑这两个代码片段,这个工作正常: for (unsigned i=0; i < polygon.size(); i++) { sum += polygon[i]; } 和这个: for (int i=0; i < polygon.size(); i++) { sum += polygon[i]; } 这会产生warning: comparison between signed and unsigned integer expressions 我是C ++世界中的新成员,所以unsignedvariables对我来说看起来有些可怕,而且我知道,如果使用不正确, unsignedvariables可能是危险的,所以 – 这是正确的吗?

定位C ++ 03时使用std :: basic_string <t>作为连续缓冲区是否合理?

我知道在C ++ 03中,从技术上说, std::basic_string模板不需要具有连续的内存。 不过,我很好奇现代编译器有多less实现可以利用这个自由。 例如,如果想要使用basic_string来接收一些C API的结果(比如下面的例子),那么分配一个向量直接把它变成一个string似乎很愚蠢。 例: DWORD valueLength = 0; DWORD type; LONG errorCheck = RegQueryValueExW( hWin32, value.c_str(), NULL, &type, NULL, &valueLength); if (errorCheck != ERROR_SUCCESS) WindowsApiException::Throw(errorCheck); else if (valueLength == 0) return std::wstring(); std::wstring buffer; do { buffer.resize(valueLength/sizeof(wchar_t)); errorCheck = RegQueryValueExW( hWin32, value.c_str(), NULL, &type, &buffer[0], &valueLength); } while (errorCheck == ERROR_MORE_DATA); […]

std :: fstream不会创build文件

我试图使用std :: fstream为io文件,并且我想创build该文件,如果它不存在。 std::fstream my_stream my_stream.open("my_file_name",std::fstream::binary | std::fstream::in | std::fstream::out); if(!my_stream) std::cout<<"error"<<strerror(errorno); 我得到这个结果:“没有这样的文件或目录。” 在这种情况下如何创build文件?

GCC STL绑定检查

如何为operator[]和迭代器启用边界检查?

如何缩小std :: vector?

有没有办法调整std :: vector来降低容量,当我不再需要以前保留的空间?