这个SO问题引发了std::generate
对标准的讨论和保证.特别是,你可以使用具有内部状态的函数对象并依赖于generate(it1, it2, gen)
调用gen()
,存储结果*it
,gen()
再次调用,存储*(it + 1)
等,或者它可以从后面开始,例如?
标准(n3337,§25.3.7/ 1)说明了这一点:
效果:第一个算法调用函数对象,
gen
并通过范围内的所有迭代器分配gen的返回值[first,last)
.第二个算法调用函数对象gen并通过范围内的所有迭代器分配gen的返回值,[first,first + n)
如果n
是正数,则不执行任何操作.
似乎没有保证排序,特别是因为其他段落具有更强的措辞,例如std::for_each
(效果:适用f
于取消引用范围中的每个迭代器的结果[first,last)
,从第一个开始并继续到last - 1
.如果我们从字面上理解它,它只是保证从开始到first
结束last
- 不保证两者之间的排序.
但是:无论微软和Apache的C++标准库既给那些需要的评价是连续的文档页面的例子.libc ++(in algorithm
)和libstdc ++(in bits/stl_algo.h
)都以这种方式实现它.此外,如果generate
没有这种保证,您将失去许多潜在的申请.
目前的措辞是否意味着顺序性?如果没有,这是委员会成员的监督还是故意的?
(我很清楚,没有很多人能够提供有关这个问题的深刻答案,而不仅仅是推测或讨论,但我认为,根据SO指南,这并不能使这个问题"没有建设性".)
感谢@juanchopanza指出这个问题,并引用了我关于的段落for_each
.
从广义上讲,我想知道内核(或CPU)如何知道进程试图访问它缺少权限的内存位置,以及称为MMU的神秘硬件如何帮助实现这一点.
特别是:在我看来,MMU对操作系统内核的内存管理模型(分页,内存区域,进程地址空间......)是不可知的(我认为Linux和Windows页面不完全相同,因为例如,如果我错了,请纠正我.但是,我的CPU如何确定当前代码是否可以访问位置x
?它如何向内核发出信号?
我在C++中使用Eigen库:我目前正在计算协方差矩阵,如下所示:
Eigen::MatrixXd covariance_matrix = Eigen::MatrixXd::Constant(21, 21, 0);
data mean = calc_mean(all_data)
for(int j = 0; j < 21; j++){
for(int k = 0; k < 21; k++){
for(std::vector<data>::iterator it = all_data.begin(); it!= all_data.end(); it++){
covariance_matrix(j,k) += ((*it)[j] - mean[j]) * ((*it)[k] - mean[k]);
}
covariance_matrix(j,k) /= all_data.size() - 1;
}
}
Run Code Online (Sandbox Code Playgroud)
是否有内置/更优化的方式来使用Eigen库?例如,如果我将数据存储MatrixXd
在每行是观察的位置,每列是一个特征?
谢谢
此方法返回'true'.为什么?
public static boolean f() {
double val = Double.MAX_VALUE/10;
double save = val;
for (int i = 1; i < 1000; i++) {
val -= i;
}
return (val == save);
}
Run Code Online (Sandbox Code Playgroud) 基本上,我想知道为什么编译器拒绝ptr2
声明:
int main() {
// this one works
decltype(void())* ptr1;
// this one does not
decltype(void{})* ptr2;
}
Run Code Online (Sandbox Code Playgroud)
如果您认为这是一个函数指针,请查看此代码ptr1
:
#include <iostream>
using namespace std;
template <class T>
void f(T t) {
cout << __PRETTY_FUNCTION__ << endl;
}
int main() {
decltype(void())* ptr;
f(ptr);
}
Run Code Online (Sandbox Code Playgroud)
输出是void f(T) [with T = void*]
.
我的Windows XP SP 2机器上有DDR2内存,但是在WMI资源管理器(win32_physicalMemory)上我得到内存类型= 0(未知)而不是21(DDR2的代码).NameSpace是CIMV2.你能告诉我如何从WMI获得DDR2内存类型吗?
我正在阅读cppreference中的std :: thread文档(并不总是100%准确,我知道),并注意到以下定义为std::thread
传递"指向数据成员指针"时的行为(不是"指针指向 - member-function")作为它的第一个参数(f
)和所需类的对象作为它的第二个参数(t1
在复制到thread-local-storage之后):
如果N == 1并且f是指向类的成员数据对象的指针,则访问它.忽略对象的值.实际上,执行以下代码:t1.*f if和t1的类型是T,引用T或引用从T派生的类型(*t1).*f否则.
现在,我不打算std::thread
以这种方式使用,但我对这个定义感到沮丧.显然,唯一发生的事情是访问数据成员并忽略值,这似乎根本就没有任何可观察到的副作用,这意味着(据我所知)它可能也是一个无操作.(我可能会遗漏一些明显的东西......?)
起初,我认为这可能是一个错误打印,并且意味着数据成员被访问然后被调用(因为它可能是一个可调用的对象,即使它不是一个函数)但我在GCC中使用以下代码对其进行了测试-4.7确实没有电话:
#include <iostream>
#include <thread>
struct S
{
void f() {
std::cout << "Calling f()" << std::endl;
}
struct {
void operator()() {
std::cout << "Calling g()" << std::endl;
}
} g;
};
int main(int, char**)
{
S s;
s.f(); // prints "Calling f()"
s.g(); // prints "Calling g()"
std::cout << "----" << std::endl;
auto x = &S::f; …
Run Code Online (Sandbox Code Playgroud) 在一个已经存在且非常大的项目中,我正在启用gcc编译器优化O1
.
没有这个选项,一切都建立,链接和运行良好.启用该选项后,主可执行文件将编译并链接,但在链接其中一个单元测试时会出现链接器错误.
在这两次编译运行之间,我没有更改任何代码或make文件,只有O1
优化标志.
我得到的错误是:
Configuration.a(Builder.o): In function `Builder::Create() const':
Builder.cpp:123: undefined reference to `Factory::Instance()'
Run Code Online (Sandbox Code Playgroud)
在链接过程中的某个地方,它会遇到Builder.cpp
:cpp文件的这一行(第123行)
pObject = Factory::Instance()->CreateObject();
Run Code Online (Sandbox Code Playgroud)
(除了Instance
函数的链接器错误,我也从CreateObject
函数中得到一个)
当我看到时Factory
,我看到:头文件
class Factory { public:
static Factory* Instance(); << rest of the file >>
Run Code Online (Sandbox Code Playgroud)
并在cpp文件中
Factory* Factory::sInstance = 0;
Factory* Factory::Instance() {
// Check if this is the first call
if (sInstance == 0)
{
// Create only instance
sInstance = new Factory();
}
// Address of the instance …
Run Code Online (Sandbox Code Playgroud) 我有一本java游戏书建议尽可能将所有数据作为Int实现,该类型运行速度最快.它说Byte,Char和Boolean都是以Int的形式实现的,所以你不需要节省空间,因为Byte数据会使代码速度降低,所以你最终不得不在代码中进行转换.例如,需要演员表
a =(字节)(b + c);
因为加法结果是一个Int,即使a,b和c都被声明为Bytes.
我目前有一个巨大的2D数组声明为我的游戏Byte,以节省空间和按位操作.它真的节省空间吗?我也看到在例子中对Ints进行按位运算,按位运算按位运行吗?
我对 obj-c 非常熟悉,现在我\xc2\xb4m 试图深入研究 C++。
\n\n我正在寻找 obj-c\xc2\xb4s 委托模式的 C++ 等效项。
\n