正如(希望)我们都知道的那样,vector<bool>完全被打破,不能被视为交流阵列.获得此功能的最佳方法是什么?到目前为止,我所想到的想法是:
vector<char>替代,或vector<bool_wrapper>你们怎么处理这个问题?我需要c_array()功能.
作为一个附带问题,如果我不需要c_array()方法,如果我需要随机访问,解决此问题的最佳方法是什么?我应该使用双端队列还是别的什么?
编辑:
c_array()是专门的,所以每个bool需要1位.因此,您无法将其转换为C风格的数组.当然,由于可能的对齐问题,我必须读入my_bool :(
struct my_bool
{
bool the_bool;
};
vector<my_bool> haha_i_tricked_you;
Run Code Online (Sandbox Code Playgroud) Scott Meyers的书第18项有效STL:50改进您对标准模板库的使用的具体方法说避免vector <bool>因为它不是STL容器而且它实际上并不存在bool.
以下代码:
vector <bool> v;
bool *pb =&v[0];
Run Code Online (Sandbox Code Playgroud)
不会编译,违反STL容器的要求.
错误:
cannot convert 'std::vector<bool>::reference* {aka std::_Bit_reference*}' to 'bool*' in initialization
Run Code Online (Sandbox Code Playgroud)
bool返回类型应该是T&,但为什么它是特殊情况vector<T>::operator []?
什么是T&真正组成的呢?
该项目进一步说:
deque<bool> v; // is a STL container and it really contains bools
Run Code Online (Sandbox Code Playgroud)
这可以用作替代品vector<bool>吗?
有人可以解释一下吗?
我正在尝试使用现有的 docker 映像在 Heroku 上部署 GitHub 机器人。
图像已经构建。我为尝试将其部署到 Heroku 所做的工作:
$ heroku login
Logging in... done
Logged in as EMAIL
$ heroku container:login
Login Succeeded
$ docker tag IMG_ID registry.heroku.com/APP/web
$ docker push registry.heroku.com/APP/web
The push refers to repository [registry.heroku.com/APP/web]
ABC: Layer already exists
XYZ: Layer already exists
...
lastest: digest: sha256:NUMBER size: SIZE
$ heroku container:release registry.heroku.com/APP/web
Expected response to be successful, got 404
Run Code Online (Sandbox Code Playgroud)
并且没有释放完成。
我已经将这些步骤基于https://devcenter.heroku.com/articles/container-registry-and-runtime#release-phase和Deploy Existing Docker Image To Heroku,但它似乎对我不起作用。
在这一点上,我很困惑,任何帮助将不胜感激。
编辑:
码头工人拉:
$ …Run Code Online (Sandbox Code Playgroud) 所以我已经使用 Azure Pipelines 设置了一些 CI,一切都很好,除了我想添加一些内存错误检查,就像我目前在 Travis 上所做的那样。在 Travis 中,我可以写:
addons:
apt:
packages:
- valgrind
Run Code Online (Sandbox Code Playgroud)
它会为我安装 valgrind 。我一直无法在 Azure Pipelines 上找到等效的功能,但必须有一种方法可以做到这一点。
我已经徒劳地搜索了他们的文档,任何帮助将不胜感激。
在C中,NULL通常#defined为0或((void *)0)。我期望这在C ++中是相似的,并且关于堆栈溢出的许多答案似乎也表明了这种情况。但是,当我尝试编译以下程序时:
#include <stdio.h>
void f(int x) {
printf("void *\n");
}
void f(void *x) {
printf("int\n");
}
int main(void) {
f(0); // int
f((void *)0); // void *
f(nullptr); // void *
f(NULL); // why is this ambiguous?
return 0;
}
Run Code Online (Sandbox Code Playgroud)
编译器告诉我这f(NULL)是模棱两可的。具体来说,我的编译器说:
sample.cpp:15:5: error: call to 'f' is ambiguous
f(NULL);
^
sample.cpp:3:6: note: candidate function
void f(void *x) {
^
sample.cpp:7:6: note: candidate function
void f(int x) {
^ …Run Code Online (Sandbox Code Playgroud) 我已经阅读了许多关于restrict关键字的帖子。但几乎我能找到的每一个例子似乎都只涉及一个函数的输入参数,也许是一个单一的值。我需要澄清我的理解。
我发现一个函数看起来完全违反了带有输入参数和局部变量的关键字规则。
这个函数被调用void*到一个缓冲区,指针被声明为__restrict(这是 Microsoft Visual C++)。然而在函数的后面,声明了一个局部变量指针类型UCHAR*并使其指向相同的受限输入参数缓冲区。
这是我正在谈论的功能的一个严重削减版本:
void Foo(int nVersion, int nX, int nY, int nWidth, void * __restrict pBuffer) const
{
// ... blah blah blah
UCHAR * __restrict pBufferPtr = ((UCHAR *) pBuffer) + 10; // Isn't this aliasing?
const void * __restrict pData = (blah blah blah); //... Get from some function call;
memcpy(pBufferPtr, pData, nWidth);
}
Run Code Online (Sandbox Code Playgroud)
上面的例子是否违反了规则restrict?
静态类型VS动态类型已被要求反复的计算器,例如这里。
共识似乎是(引用以上链接的最高答案):
如果在编译时就知道变量的类型,则语言是静态类型的。
和动态语言:
如果一种语言与运行时值关联,而不是命名为变量/字段/等,则该语言是动态类型的。
Perl似乎是通过这种方式(或静态/动态类型的其他常见定义)进行静态类型化的。它具有3种类型:标量,数组,哈希(为简单起见,忽略诸如引用之类的东西)。类型与变量一起声明:
my $x = 10; # declares a scalar variable named x
my @y = (1, 2, 3); # declares an array variable named y
my %z = (one => 1, two => 2); # declares a hash variable named z
Run Code Online (Sandbox Code Playgroud)
的$,@和%上面就告诉Perl你想要的类型; 我认为这是显式键入的一种形式。
x如上所述,一旦被声明为标量,就无法在中存储非标量值x:
$x = @y; # x is now 3
Run Code Online (Sandbox Code Playgroud)
将转换y为标量(在Perl中,数组到标量的转换导致数组的长度)。我将此归咎于弱类型(Perl非常自由地允许其3种类型之间进行转换),而不是动态类型。
在大多数静态类型的语言中,这样的分配将是一个错误,但是在Perl中,由于隐式转换是可以的(类似于bool x = 1;C / C ++,但在Java中则没有问题:两者都是静态类型,但是Java更强大在这种情况下键入)。这种转换在Perl中完全发生的唯一原因是因为的类型 …
我有一个纯虚拟类,BaseClass没有数据成员和受保护的构造函数。它的存在只是为了提供子类(模板化的)的接口。我想要在基类中实现的所有功能。对这些进行操作的函数通常会返回BaseClass&,以允许方便的操作链接。
一切都很好,直到我尝试抛出一个实例,该实例是通过函数之一的引用返回的。简而言之,我抛出了对抽象类的引用,但我确信它肯定是一个完全构造的子类实例,并且所有虚拟函数都完好无损。这就是BaseClass构造函数受到保护的原因。我正在针对 C++14 编译器进行编译。它拒绝让我抛出一个抽象类。
该类的要点之一是我可以构造一个子类,立即调用它的函数来添加信息,然后抛出它,一举完成:
throw String<72>().addInt(__LINE__).addText("mom says no"); //does not compile
Run Code Online (Sandbox Code Playgroud)
但是addText(),非常合理地,返回BaseClass&,并且编译器拒绝。
我如何能?将所有成员函数移到子类中似乎是令人厌恶的。我可以通过在抛出之前静态转换整个表达式来解决它:
throw static_cast<String<72&>( //works, ugly
BaseClassString<72>().addText(where).addText(why).addText(resolution));
Run Code Online (Sandbox Code Playgroud)
甚至创建一个宏来隐藏丑陋的机制并确保一定的安全,但我是否遗漏了一些东西?这看起来像是 C++ 阻止了一项完全可行的技术的情况。
int *a = new int[16];
Run Code Online (Sandbox Code Playgroud)
之后如何访问该数组?
保存a整个数组的地址还是仅保存数组中的第一个元素?
基本上,我有这个代码,
struct student {
string name;
int age;
};
int num_students = get_number_of_students();
struct student *students = new student[num_students];
Run Code Online (Sandbox Code Playgroud)
现在,我如何访问该数组中的元素?
我想创建一个函数,该函数可以计算圆的表面积。
#define pi 3,14159265
float FI (float r);
float FI (float r) {
float x;
x = pi * (r * r); //pi is defined at the beginning. I cut the "head"
return x;
}
Run Code Online (Sandbox Code Playgroud)
FI 无论我输入什么,它都会返回3。
请帮我。我真的不知道该怎么办。
编辑:改为FI返回int而不是float。