小编us2*_*012的帖子

C++标准措辞:"通过范围内的所有迭代器"是否意味着顺序性?

这个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.

c++ standards std c++11

26
推荐指数
2
解决办法
466
查看次数

分段故障如何在内部工作(内核/硬件)?

从广义上讲,我想知道内核(或CPU)如何知道进程试图访问它缺少权限的内存位置,以及称为MMU的神秘硬件如何帮助实现这一点.

特别是:在我看来,MMU对操作系统内核的内存管理模型(分页,内存区域,进程地址空间......)是不可知的(我认为Linux和Windows页面不完全相同,因为例如,如果我错了,请纠正我.但是,我的CPU如何确定当前代码是否可以访问位置x?它如何向内核发出信号?

c hardware memory-management linux-kernel

15
推荐指数
2
解决办法
4110
查看次数

特征:是否有一种内置的方法来计算样本协方差

我在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在每行是观察的位置,每列是一个特征?

谢谢

c++ statistics eigen

14
推荐指数
2
解决办法
2万
查看次数

Java的'=='运算符是双精度数

此方法返回'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)

java floating-point equals-operator

9
推荐指数
1
解决办法
369
查看次数

void()和void {}之间有什么区别?

基本上,我想知道为什么编译器拒绝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*].

c++ c++11

9
推荐指数
1
解决办法
427
查看次数

如何使用WMI/C++获取内存信息(RAM类型,例如DDR,DDR2,DDR3?)

我的Windows XP SP 2机器上有DDR2内存,但是在WMI资源管理器(win32_physicalMemory)上我得到内存类型= 0(未知)而不是21(DDR2的代码).NameSpace是CIMV2.你能告诉我如何从WMI获得DDR2内存类型吗?

c++ wmi

8
推荐指数
1
解决办法
2万
查看次数

带有指向数据成员的指针的std :: thread

我正在阅读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)

c++ std c++11

5
推荐指数
1
解决办法
909
查看次数

使用O1优化时出现C++链接器错误

在一个已经存在且非常大的项目中,我正在启用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)

c++ linker gcc compiler-optimization

5
推荐指数
1
解决办法
951
查看次数

是否将Byte实现为Int?

我有一本java游戏书建议尽可能将所有数据作为Int实现,该类型运行速度最快.它说Byte,Char和Boolean都是以Int的形式实现的,所以你不需要节省空间,因为Byte数据会使代码速度降低,所以你最终不得不在代码中进行转换.例如,需要演员表

a =(字节)(b + c);

因为加法结果是一个Int,即使a,b和c都被声明为Bytes.

我目前有一个巨大的2D数组声明为我的游戏Byte,以节省空间和按位操作.它真的节省空间吗?我也看到在例子中对Ints进行按位运算,按位运算按位运行吗?

java int byte

4
推荐指数
1
解决办法
205
查看次数

obj-c 委托模式在 C++ 中的等价物是什么?

我对 obj-c 非常熟悉,现在我\xc2\xb4m 试图深入研究 C++。

\n\n

我正在寻找 obj-c\xc2\xb4s 委托模式的 C++ 等效项。

\n

c++ delegates objective-c

3
推荐指数
1
解决办法
1885
查看次数