草庐IT

c++ - push_back() 和 emplace_back() 在幕后

我目前正在自学C++,我很好奇push_back()和emplace_back()是如何工作的。当您尝试构建大型对象并将其推到容器的背面时,我一直认为emplace_back()更快。​​假设我有一个Student对象,我想将其附加到Studentsvector的后面。structStudent{stringname;intstudent_ID;doubleGPA;stringfavorite_food;stringfavorite_prof;inthours_slept;intbirthyear;Student(stringname_in,intID_in,doubleGPA_in,

c++ - std::sort 自定义比较器

在下面的代码中,为什么IntComparator()、IntComparator2和IntComparator3这三个都作为的第三个参数排序()函数?他们不会有不同的左值函数类型吗?基于https://en.cppreference.com/w/cpp/algorithm/sort它说Thesignatureofthecomparisonfunctionshouldbeequivalenttothefollowing:boolcmp(constType1&a,constType2&b);哪个似乎更匹配IntComparator2?还有哪一个更可取?第三个选项似乎更简单、更直观。#inc

c++ - 为什么我的程序在内存不足时偶尔会出现段错误而不是抛出 std::bad_alloc?

我有一个程序可以实现多种启发式搜索算法和多个域,旨在通过实验评估各种算法。该程序是用C++编写的,使用GNU工具链构建,并在64位Ubuntu系统上运行。当我运行我的实验时,我使用bash的ulimit命令来限制进程可以使用的虚拟内存量,这样我的测试系统就不会开始交换。某些算法/测试实例组合达到了我定义的内存限制。大多数时候,程序会抛出一个std::bad_alloc异常,该异常由默认处理程序打印,此时程序终止。有时,程序不会发生这种情况,而只是出现段错误。为什么我的程序偶尔会在内存不足时出现段错误,而不是报告未处理的std::bad_alloc并终止? 最

c++ - 为现有缓冲区提供 std::istream 接口(interface)而不复制它

我有一个固定长度的字符缓冲区,我想将它提供给一个接受std::istream&的函数。如何在不复制缓冲区的情况下做到这一点?如果这意味着派生自定义streambuf,我想我会接受拷贝。我只是想知道我是否遗漏了一些直截了当的东西。这是我现在正在做的事情(执行不需要的拷贝):voidloadFromBuffer(constchar*buff,size_tlen){std::istringstreamis(std::string(buff,len));//BUFFERCOPIEDHERE:(load(is);}编辑:作为记录,这是使用boost.Iostreams的直接解决方案:#inclu

c++ - header `execution` 和 `std::reduce` 未找到

我正在尝试编译这段代码#include#include#includedoubleresult=std::reduce(std::execution::par,v.begin(),v.end());我试过这些编译器:AppleLLVMversion8.1.0(clang-802.0.42)clangversion3.8.0-2ubuntu4(tags/RELEASE_380/final)g++(Ubuntu5.4.0-6ubuntu1~16.04.4)5.4.020160609所有三个都给我'execution'filenotfound分别错误:命名空间'std'中没有名为'reduc

c++ - C++11 中的 std::sin 变化?

cppreference包括以下关于thereturnvalueofstd::sin的描述:Theresultmayhavelittleornosignificanceifthemagnitudeofargislarge(untilC++11)我试图在当前的C++标准中找到关于此的信息,但我一无所获(也许我错过了?)。在C++11中关于std::sin到底发生了什么变化? 最佳答案 C++11将C标准引用从C89/C90切换到C99。原来的C标准用于声明(引用自草稿):Thesinfunctioncomputesthesineofx

c++ - std::visit for variant 无法在 clang 5 下编译

这个问题在这里已经有了答案:getforvariantsfailunderclang++butnotg++(1个回答)关闭4年前。std::visit的以下使用在gcc7.2下可以正确编译,但在clang5.0下无法编译。有谁知道问题出在哪里?#includestructS1{intfoo(){return0;}};structS2{intfoo(){return1;}};usingV=std::variant;intbar(){Vv;returnstd::visit([](auto&s){returns.foo();},v);}第一个错误是这样的:include/c++/7.2.0/

c++ - 如何在 std::map 中查找指定范围内的元素?

是否有std::find(first,last)除了std::map的等效版本?即,是否有std::map的find方法在map中搜索元素的版本,但仅限制搜索到指定的[first,last)范围?理想情况下,解决方案的大小应为[first,last)的对数。来自whatI'veseen,std::map::find本身不支持这个功能(它总是搜索整个map)。 最佳答案 您可以使用std::lower_bound、std::upper_bound或std::equal_range作为std::map迭代器和map中的数据满足这些函数的

c++ - 我将如何在 C++20 中传递范围而不是迭代器对?

我听说C++20将支持作用于范围,而不仅仅是开始+结束迭代器对。这是否意味着,在C++20中,我将能够编写:std::vectorvec=get_vector_from_somewhere();std::sort(vec);std::vectorhalves;halves.reserve(vec.size());std::transform(vec,std::back_inserter(halves),[](intx){returnx*0.5;});? 最佳答案 几乎,是的!您只需要使用std::ranges::命名空间而不仅仅是s

c++ - std::list 上的 splice() 和迭代器失效

list::splice()的三参数形式将单个元素从一个列表移动到另一个列表。SGI'sdocumentation明确声明所有迭代器,包括指向被移动元素的迭代器仍然有效。Roguewave'sdocumentation没有说明splice()方法的迭代器失效属性,而C++标准明确指出它会使所有迭代器和对被拼接元素的引用失效。splicing()在实践中按照SGI的定义工作,但我在Microsoft的STL实现(严格遵循标准的字母)的调试/安全SCL版本中遇到断言失败(取消引用无效迭代器)。现在,我使用列表正是因为我想在列表之间移动一个元素,同时保持指向它的迭代器的有效性。该标准对原始S