草庐IT

c++ - 简单但频繁使用 std::stringstream 是否过早悲观?

我有一个简单的场景。我需要将两个C字符串连接成一个std::string。我决定采用以下两种方式之一:方案一voidProcessEvent(charconst*pName){std::stringfullName;fullName.reserve(50);//Ensureminimalreallocationsforsmalleventnames(50isanarbitrarylimit).fullName+="com.domain.events.";fullName+=pName;//UsefullNameasneeded}解决方案2voidProcessEvent(charcon

c++ - STL 模板容器的 GDB 中的 "Cannot evaluate function -- may be in-lined"错误

我希望能够使用GDB从STL容器中获取地址并打印一对。例如,给定以下玩具程序:#includeintmain(){std::mapamap;amap.insert(std::make_pair(1,2));}我编译为:g++-ggdb3-O0-std=c++11-Wall-Wextra-pedantic-omain.outmain.cpp然后,当我尝试检查map的单个元素时,例如:pamap.begin()我得到:"Cannotevaluatefunction--maybein-lined"为什么会发生这种情况,我该如何解决?在Ubuntu20.04、GCC9.3.0、2.34中测试。

c++ - 删除集合迭代器值并递增迭代器

我见过一个程序员写过这个。autoit=myset.lower_bound(x);myset.erase(it++);如果我已经删除了当前迭代指针值,如何通过后自增运算符获取下一个迭代指针? 最佳答案 当你打电话时myset.erase(it++);一些事情发生了。首先it++在被传递给函数之前被求值。当您评估it++时,其结果是it并且这就是传递给函数的内容。因此,您的函数获取it的值,但调用站点中it的值是递增后的值。这意味着当erase删除迭代器指向的元素时,它正在删除旧迭代器指向的你不再拥有的元素。这是从set中删除元素的完

c++ - 为什么STL要为Allocator预留接口(interface)?

STL为什么要为Allocator预留接口(interface)?以vector为例:template>classvector;因为我们有很多选择来分配内存和构造对象,比如operatornew,delete,new[],delete[],它几乎可以做我们创建对象时需要做的任何事情。那么,为什么像vector这样的STL容器需要一个Allocator接口(interface),如果我们不分配一个,它在大多数情况下都是默认的std::allocator?为什么不直接使用新的表达式呢?如果目的是使用户定义的分配行为成为可能,为什么不让用户提供他们自己定义的operatornew、new[]

c++ - 为什么 std::map 有一个 find 成员函数?

我和一位同事正在讨论成员职能与非成员职能的相对优点。一个问题出现了:为什么std::map有一个find成员函数。我的回答是,虽然您可以在map上使用std::find,但您必须搜索键值对,或者使用find_if和例如一个lambda。然而,这是线性的,map.find提供了比线性时间更好的按键搜索。我最后断言,如果它可能是非成员(member),那么它本来就是!(尽管std::string表明我的概括可能有些草率)。我的同事指出,可以使用map.lower_bound以与非成员函数相同的方式实现find。map.find成为成员(member)是否有理由?

c++ - 如何测试 std::memory_order_relaxed 的行为?

我已经阅读了std::memory_order_relaxed的文档.Relaxedordering的部分解释是......//Thread1:r1=y.load(memory_order_relaxed);//Ax.store(r1,memory_order_relaxed);//B//Thread2:r2=x.load(memory_order_relaxed);//Cy.store(42,memory_order_relaxed);//D对此的解释是……[It]isallowedtoproducer1==r2==42.Inparticular,thismayoccurifDisc

c++ - 在 Linux 上用 C++ 实现线程安全的通用堆栈

在最近的一次采访中,我被要求在Linux机器上用C++实现一个线程安全的通用(即基于模板的)堆栈。我很快想到了以下(可能有编译错误)。我打通了。面试官可能喜欢这个实现中的某些东西。也许是设计部分:)以下是此实现可能存在的一些问题:-1.指示上溢/下溢的实现不正确。没有溢出处理,因为我使用STLvector作为底层数据结构。应该有这样的处理吗?此外,下溢(在Pop()中)产生false作为返回值。是否应该通过抛出异常来完成?2.PopElem例程的实现。下面的实现是否正确?3.没有真正使用top元素。4.作者和读者线程开始之间更好的时机。请提出任何意见/建议/改进。谢谢。//实现线程安全

c++ - 这个 C++ 模板中的迭代器类型应该是什么?

在前一段时间处理一些图形代码时,我使用int作为底层坐标持有者编写了Rect和Region类,并且效果很好。Region是作为STL列表的简单类扩展实现的,并且只包含一个Rect列表。现在我还需要使用double作为基础坐标持有者的相同类型的类,并决定尝试将其模板化。所以我基本上以智能方式将“int”替换为“typenameT”并解决了问题。但是还有一个问题让我很困惑。我想通过对构成它的所有Rect进行并集来计算区域的边界框。这在未模板化时工作正常,但在模板化时g++在列表迭代器上阻塞。相关代码如下://Rectclassthatalwaysremainsnormalizedtempl

c++ - std::vector<char> 中元素的字节对齐方式是什么?

我希望元素是1字节对齐的,类似于std::vector是4字节对齐的(或任何大小int恰好在特定平台上)。有谁知道标准库容器是如何对齐的? 最佳答案 容器的元素至少在该实现中具有它们所需的对齐方式:ifint在您的实现中是4对齐的,那么vector的每个元素是一个int因此是4对齐的。我说“如果”是因为大小和对齐要求之间存在差异-只是因为int就标准而言,大小为4并不一定意味着它必须是4对齐的。不过,这很常见,因为int通常是机器的字长,并且大多数机器在字边界上的内存访问方面具有优势。所以对齐int是有意义的即使这不是绝对必要的。例

c++ - 计算 STL map 不相交子范围平均值的有效方法

我正在将算法从C#转换为C++。该算法的一小部分是计算字典中某些区域的平均值。字典中数据的存储方式如下:IndexValue11032829078111090我需要计算索引小于某个数字的所有值和大于某个数字的所有索引值的平均值。在C#中,我按以下方式进行:if(dictionary.Where(x=>x.Key0){avgValue=(int)dictionary.Where(x=>x.Keyx.Value);}for(vari=0;ix.Key>(rightBorder)).Count()>0){avgValue=(int)dictionary.Where(x=>x.Key>(rig