草庐IT

stl-algorithm

全部标签

c++ - 64 位构建中 STL/OpenMP 的奇怪并发问题

当我在64位调试配置中构建我们的项目之一时,我遇到了一个奇怪的问题。它似乎产生了一些奇怪的行为,看起来有点像单个迭代器多次递增。我已将其缩小为以下测试代码:#include#define_HAS_ITERATOR_DEBUGGING0#include#includeintmain(intargc,constchar*argv[]){std::vectorv;for(intj=0;js;std::vector::const_iteratorbegin=v.begin(),end=v.end();s.insert(begin,end);//afterthislinesshouldconta

c++ - C++ STL 对于不同的容器是否是线程安全的(使用 STLport 实现)?

我使用的是Android2.2,它带有一个STLport版本。由于某种原因,它被配置为非线程安全的。这是在配置头文件中使用#define_NOTHREADS完成的。当我从不同的pthreads构造和初始化distinct非共享容器(例如字符串)时,我遇到了内存损坏。对于_NOTHREADS,看起来allocator.cpp中的STL中的一些低级代码没有进行正确的锁定。这似乎类似于C不为malloc提供线程安全。有谁知道为什么在Android上默认使用_NOTHREADS构建STL?通过关闭它,我想知道是否会有副作用。我能想到的一件事是性能略有下降,但鉴于我使用的是大量线程,我看不到太多

c++ - 清零 STL 容器使用的内存

我想使用STL容器(加上std::basic_string)在内存中临时存储key或密码,完成后我想将内存归零。我最初计划使用在自定义分配器上参数化的STL容器,该分配器将allocator::deallocate中的内存清零,但我假设允许容器使用并非来自指定的分配器。例如,std::vector或std::string包含用于小分配的固定大小数组成员似乎是合理的。我的担心是否正确,我是否应该(叹息)编写自己的容器? 最佳答案 我会将std::vector与自定义分配器一起使用,该分配器执行归零操作。根据Maystd::vector

c++ - 多个代理类可以组成一个 STL 证明位 vector 吗?

是wellknown那std::vector不满足标准的容器要求,主要是因为打包表示阻止了T*x=&v[i]从返回一个指向bool的指针。我的问题是:当reference_proxy重载operator&的地址时,是否可以补救/缓解这种情况?返回一个pointer_proxy?在大多数实现中,指针代理可以包含与reference_proxy相同的数据,即指向打包数据的指针和用于隔离指向的block内的特定位的掩码。然后pointer_proxy的间接将产生reference_proxy。本质上,这两个代理都是“胖”指针,但是,与基于磁盘的代理容器相比,它们仍然相当轻量级。而不是T*x=

c++ - boost::filter_iterator——我将如何使用 STL 做到这一点?

我收到了一个迭代器,我必须将它传递给另一个函数——但经过过滤以便跳过某些元素(这是一个指针范围,我想过滤掉NULL指针)。我在谷歌上搜索了“STLfilteriterator”以查看如何执行此操作,并且boost::filter_iterator上来了。这看起来不错,我可以使用它,但我也可以使用良好的旧STL来实现吗?当然,无需将元素复制到新容器中。我想我必须创建另一个迭代器类来提供必要的begin()、end()等函数并进行过滤?所以我必须重新实现boostiterator_filter...? 最佳答案 你是对的;您实际上是在自

c++ - STL 容器如何复制对象?

我知道像vector这样的STL容器会在添加对象时复制对象。push_back方法如下所示:voidpush_back(constT&x);我很惊讶地看到它将项目作为引用。我写了一个示例程序来查看它是如何工作的。structFoo{Foo(){std::coutfoos;foos.push_back(f);这会复制对象,我可以看到它正在调用copy-constructor。我的问题是,当push_back将item作为引用时,它是如何调用复制构造函数的?或者我在这里遗漏了什么?有什么想法..? 最佳答案 它可能使用“placemen

c++ - std::is_sorted 和 strictly less 比较?

我不太明白std::is_sorted算法及其默认行为。如果我们查看cppreference,它表示默认情况下std::is_sorted使用运算符(operator)。相反,我发现使用会很自然。但我的问题是,对于以下数字列表:123345它将返回true,即使3应该是false.这怎么可能?编辑:它似乎比我想象的更糟糕,因为通过了std::less_equal在这种情况下将返回false...当我传递比较器函数时应用的条件是什么? 最佳答案 根据25.4/5:Asequenceissortedwithrespecttoacompa

c++ - 为什么 std::copy_if 签名不约束谓词类型

假设我们有以下情况:structA{inti;};structB{Aa;intother_things;};boolpredicate(constA&a){returna.i>123;}boolpredicate(constB&b){returnpredicate(b.a);}intmain(){std::vectora_source;std::vectorb_source;std::vectora_target;std::vectorb_target;std::copy_if(a_source.begin(),a_source.end(),std::back_inserter(a_t

c++ - STL迭代器相等性是如何建立的?

我想知道,STL迭代器的相等性(==)是如何建立的?它是简单的指针比较(因此基于地址)还是更花哨的东西?如果我有来自两个不同列表对象的两个迭代器并比较它们,结果是否总是错误的?如果我将一个有效值与超出范围的值进行比较怎么办?这总是错误的吗? 最佳答案 如果需要,迭代器类可以定义重载的==运算符。所以结果取决于operator==的实现。您真的不应该比较来自不同容器的迭代器。我认为如果您这样做,一些调试STL实现会发出警告信号,这将帮助您在代码中发现这种错误使用情况。 关于c++-STL迭

c++ - STL 函数式——为什么?

在C++标准模板库中,有一个“功能”部分,其中许多类重载了它们的()运算符。在C++中将函数作为对象使用有什么便利吗?为什么我们不能只使用函数指针呢?有什么例子吗? 最佳答案 当然,人们总是可以使用函数指针而不是函数对象,但是函数对象相对于函数指针有一些优势,即:更好的性能:最明显和最重要的优势之一是它们更有可能产生更好的性能。在函数对象的情况下,更多细节在编译时可用,以便编译器可以准确地确定并因此内联要调用的函数,这与函数指针的情况不同,在函数指针的情况下,指针的取消引用使编译器难以确定实际函数将被调用。函数对象是智能函数:函数对