草庐IT

c++ - 多个 std::atomic<T> 条件

在我的多线程应用程序中,我有一个可以简化为这个例子的条件std::atomica,b;//...if(a.load()&&b.load()){//...}显然,在条件之后,a和b可以持有不同的值。在我的应用程序中,它认为,如果两个值同时为真,它们就不能再改变状态。但是在a.load()返回true之后,它可能甚至在b.load()被评估之前改变它的值。是否有一个优雅的解决方案来原子地评估这个声明?显然,锁定a.store(..)和b.store(..)的每次调用都可以在这里工作,但这远非好事。 最佳答案 您是否考虑过使用atomic

c++ - std::list 的新位置

我正在寻求实现一个(双向)链表,它仅在内部调用placementnew,将所有内存定向到分配有类似内容的池:char*memPool=newchar[4096];//One-offnormal'new'最初我打算实现我自己的类,它接受一个指向(类管理)预分配内存池的指针。但是,我想首先确定我无法使用std::list获得相同的结果。特别是,thethirdsectionofDavidRodríguez'sanswertothisSOquestion让我担心。std::list必须在其组件节点上调用new和delete是有道理的,但我想修改它行为,以便将所有节点分配到我的自定义池中。因此

c++ - 使用 std::initializer_list 创建树?

我有这样的东西:structExprTreeNode{charc;std::vectori;};ExprTreeNodetn{'+',{1,2,3,4}};我想写的是这样的:MyTreet1{'+',{1,2,{'*',{3,4,5}}}};MyTreet2{'*',{{'+',{77,88,99,111}},{'-',{44,33}}}};我可以自由定义MyTree类(和可能的辅助类)——但它应该是树状的——比如作为TreeNode内容的运算符和包含子节点的容器(例如std::vector)。在C++中是否可以使用这样的initializer_list来初始化树状结构?(如果可能的话

c++ - constexpr 数组和 std::initializer_list

我正在尝试编写一个可以像这样使用的编译时valarray:constexprarraya={1.0,2.1,3.2,4.3,5.4,6.5};static_assert(a[0]==1.0,"");static_assert(a[3]==4.3,"");static_assert(a.size()==6,"");我设法通过以下实现实现了它并且工作正常(使用GCC4.7):#includetemplatestructarray{private:conststd::size_t_size;constT*_data;public:constexprarray(std::initializer

c++ - 如果我想要最大速度,我应该只在 std::vector 上使用数组吗?

就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter为指导。8年前关闭。我正在编写一些需要尽可能快的代码,而不会占用我所有的研究时间(换句话说,没有手动优化的程序集)。我的系统主要由一堆3D点(原子系统)组成,因此我编写的代码进行了大量距离比较、最近邻搜索以及其他类型的排序和比较。这些是大型的、百万或十亿点系统,并且简单的O(n^2)嵌套for循环不会削减它。对我来说最简单的方法是使用std::vector保持点坐标。起初我认为

c++ - Win32 CMutex 与标准库 std::mutex 的比较

自从引入threadC++11中的库,我一直在检查我的代码并进行一些更改,以将其从特定于平台的多线程代码转移到可移植的标准库代码。但是,我很好奇标准库之间是否存在性能或功能差异std::mutex和std::lock_guard和Win32特定的CMutex和CSingleLock.我没有分析多线程代码的经验,而且我不知道这两个互斥锁类中任何一个的内部结构,所以我什至无法冒险猜测。 最佳答案 功能性尊重是肯定的--CMutexstd::mutex直接映射到Win32互斥类型更基本,可能使用win32CRITICAL_SECTION实

c++ - std::map<key_type, value_type>::find(different_key_type)

我有一张map:std::mapmyMap;但是,在某些情况下,我想通过比较TyString==TyStringRef来std::map::find一个条目,即myMap.find(TyStringRef("MyString"));原因是TyString包装了一个它自己分配和释放的constchar*。但是,为了只找到一个条目,我不喜欢分配一个新的字符串,而是我只想使用引用(TyStringRef只包装一个constchar*而不分配或释放内存)。当然,我可以将TyStringRef转换为TyString,但这样我就有了上述的内存开销。有解决这个问题的智能方法吗?谢谢!

c++ - 删除时 std::list end() 迭代器位置是否改变?

在下面的循环中,我使用了一个预先计算好的结束迭代器:std::list::iteratorend=MyList.end();for(std::list::iteratorit=MyList.begin();it!=end;)it=MyList.erase(it);当删除std::list中的元素时,MyList.end()是否可以更改其值以便end!=MyList.end()不再存在? 最佳答案 没有。n337623.3.5.4iteratorerase(const_iteratorposition);iteratorerase(c

c++ - 将 boost filtering_stream 替换为 std::ofstream 的参数语法

关于boostfiltering_streams的一些基本问题。我有几十个函数接受std::ofstream&的参数voidfoo(std::ofstream&outStream){//lotsofoperations,likethis:outStream现在我想使用boostfiltering_stream输出到一个压缩的ZIP文件。经常引用的用于打包和解包的boostfiltering_streams测试代码经过编译、链接和完美运行。我想替换filtering_stream:voidStreamSomeCompressedTextToFile(char*fileName){ofst

c++ - 使用 std::sort 和 std::next_permutation

我编写了以下代码并且运行良好。我只是无法理解它为什么起作用。更具体地说,为什么我们必须先对数组进行排序才能使用std::next_permutation,它不能从任何配置开始吗?最让我困扰的部分是我不明白为什么我们必须写sort(sides,sides+3)和next_permutation(sides,sides+3)为什么是“+3”!因为我在数组中有三个元素?如果我使用任意数量的元素怎么办?boolvalid(intsides[],ofstream&outfile){inti=0;for(;isides[2]);else{outfile 最佳答案