草庐IT

c++ - Ratio<,> 是常量,但如果我想接受不同的比率作为参数怎么办?

也许是一个矛盾的问题:ratio根据定义,是一个编译时常量。但是,我想构建具有不同比率的持续时间,这些比率可以由我的方法的调用者指定。我想我应该使用比率和/或持续时间以外的东西,但是什么?比方说,我想要一个可以在运行时设置的类成员,并且我希望它的类型为ratio。在代码中的某个位置,这个成员被设置/分配,它会被分配一个恒定的比率,但在我的类(class)中,我不想指定该比率应该是多少。 最佳答案 好的,你需要一个std::ratio“可以由调用者指定”。共有三个不同的选项:调用者想要设置std::ratio编译时期间的模板参数。这很

c++ - vector 元素如何在 vector std::move 之后保留其原始地址?

正如您在输出中看到的,vectorpre的对象不仅“move”到vectorpost,而且还在内存中保留了它们的原始地址空间.此举背后究竟发生了什么?这种行为是预期的吗?假设我需要一个单独的指向这些对象的指针vector,是否可以安全地假设在此move之后对象将始终具有其原始地址?实际上,我有一个包含这样的vector和我作为成员提到的指针vector的类。我还删除了复制ctors,并为类定义了movectors。#include#includestructB{intval=0;B(intaInt):val(aInt){};};intmain(){std::vectorpre;pre.

c++ - 如何实现类似 std::copy_if 但在插入到不同容器之前应用函数的方法

完全公开,这可能是一个锤子和钉子的情况,在不需要的时候尝试使用STL算法。我在我正在使用的一些C++14代码中看到了一个重新出现的模式。我们有一个迭代的容器,如果当前元素符合某些条件,那么我们将其中一个元素字段复制到另一个容器。模式是这样的:for(autoit=std::begin(foo);it!=std::end(foo);++it){autox=it->Some_member;//Note,thecheckusuallyusesthefieldwouldaddtothenewcontainer.if(f(x)&&g(x)){bar.emplace_back(x);}}这个想法几

c++ - gcc 在这个概念定义中错误地评估了 std::declval 吗?

在这个概念定义中:#includetemplateconceptInvokable=requires(Funcf){{f(std::declval()...)}->Ret;};像这样实例化时:static_assert(Invokable);gcc-9.0.1(主干)转储(好吧,准确地说是标准库实现):$g++-O2-std=c++2a-fconcepts-Wall-Wextra-Werror-ctu1.cpperror:staticassertionfailed:declval()mustnotbeused!2204|static_assert(__declval_protector

c++ - 到处使用 std::size_t 是一种好习惯吗?

这个问题在这里已经有了答案:关闭12年前。PossibleDuplicate:Whentousestd::size_t?我的代码中有很多常量是无符号数,例如计数器、截止频率、长度等。我开始对所有这些使用std::size_t,而不是int或unsignedint。这样做对吗?我启动它是因为STL容器将它用于它们的大小,它用于字符串位置等。

c++ - std::vector<std::string> 崩溃

这个问题是myquestion的延续.这是有问题的代码。嗯:#include#includestd::vectorfoo();a.cpp#include"a.h"std::vectorfoo(){std::vectorv;returnv;}最后是main.cpp:#include"a.h"#includeintmain(){std::vectors=foo();return0;}编译如下(main.cpp是带STL调试标志编译的):g++-ca.cppg++-D_GLIBCXX_DEBUGmain.cppa.o运行a.out时,进程崩溃:Corewasgeneratedby`./a.o

c++ - 迭代器和模板

我正在尝试实现一个函数,允许用户输入某种类型的开始和结束迭代器,然后对数据执行一些操作。但是,该函数必须足够通用,它应该适用于多种类型的迭代器(例如std::vector::iterator、std::string::iterator、std::iterator等)。唯一的限制是迭代器必须至少为forward_iterator_tag。能力。我的函数原型(prototype)是这样的:templatestd::shared_ptrremove(std::iteratorkey_start,std::iteratorkey_end);但是,这限制了我专门使用forward_iterato

c++ - 从文件中读取 N 个字节并将它们附加到 std::vector

我想从文件流中读取N字节的数据并将它们附加到vector中。假设我们有一个basic_ifstreammyFileStream;和一个vectormyBuffer;目前我正在做这样的事情:myBuffer.reserve(N);for(inti=0;i但这非常慢。现在我试着让myFileStream.read直接将数据复制到vector中。由于vector将其元素存储在连续的存储位置,我认为这样的事情应该是可能的:uint8_t*ptr=&myBuffer.back();//thereisalreadysomeelementsinthebuffer(Iknow)ptr++;//firs

c++ - C++ 中的 reduce 函数(用于许多集合 union )

我正在尝试做的事情:我在使用STL的C++中有一个简单的集合union函数,我试图将它包装在一个函数中,该函数可以让我执行STL数据结构中包含的任意多个集合的union(例如std::list、std::vector、std::forward_list、...).我是如何尝试做到的:首先,我的简单集合并集:#includetemplateset_typesunion(constset_type&lhs,constset_type&rhs){set_typeresult;std::set_union(lhs.begin(),lhs.end(),rhs.begin(),rhs.end(),

c++ - std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n' ) 使用#include <Windows.h> 时出错

这个问题在这里已经有了答案:std::max-expectedanidentifier(6个答案)macro"max"requires2arguments,butonly1given(4个答案)关闭去年。在VisualStudio2010Pro中,我在max()上收到一个编译错误,指出“需要一个标识符”命令的一部分。似乎在windows.h头文件中有一个max(a,b)标识符和编译器想要使用它。我尝试使用#include也一样,但这并没有解决问题。有什么办法可以解决这个问题吗?