小编Var*_*lex的帖子

在C++ 11中'typedef'和'using'有什么区别?

我知道在C++ 11中我们现在可以using用来写类型别名,比如typedefs:

typedef int MyInt;
Run Code Online (Sandbox Code Playgroud)

从我的理解,相当于:

using MyInt = int;
Run Code Online (Sandbox Code Playgroud)

这种新语法来自于努力表达" template typedef":

template< class T > using MyType = AnotherType< T, MyAllocatorType >;
Run Code Online (Sandbox Code Playgroud)

但是,对于前两个非模板示例,标准中是否还有其他细微差别?例如,typedefs以"弱"方式进行别名.也就是说,它不会创建新类型,而只会创建新名称(这些名称之间隐含的转换).

它是否与using生成新类型相同或是否生成新类型?有什么不同吗?

c++ typedef using-declaration c++11

833
推荐指数
8
解决办法
25万
查看次数

如何使用std :: sort在C++中对数组进行排序

如何使用标准模板库std::sort()对声明为的数组进行排序 int v[2000];

C++是否提供了一些可以获取数组的开始和结束索引的函数?

c++ sorting

84
推荐指数
4
解决办法
18万
查看次数

为什么不允许继承成员?

我是C++的初学者,我正在做一个关于抽象类和继承的练习.

这是我的抽象类:

#ifndef   SHAPE_H 
#define  SHAPE_H
class Shape
{
    public:
        virtual void area();
        virtual void perimeter();
        virtual void volume();
};
#endif
Run Code Online (Sandbox Code Playgroud)

这是我实现抽象类的具体类:

#include <iostream>
#include <cmath>
#include "Shape.h"
using namespace std;

class Circle : public Shape
{
    public:
        Circle(int);
    private:
        int r;
};

Circle::Circle(int rad)
{
    r = rad;
}

void Circle::area()
{
    cout << "Area of this cirle = " << 3.14 * pow(r, 2) << endl;
}

void Circle::perimeter()
{
    cout << "Perimeter of this cirle = " …
Run Code Online (Sandbox Code Playgroud)

c++ inheritance

39
推荐指数
3
解决办法
4万
查看次数

如何在C中的分叉进程上使用POSIX信号量?

我想分叉多个进程,然后在它们上使用信号量.这是我尝试过的:

sem_init(&sem, 1, 1);   /* semaphore*, pshared, value */
.
.
.
if(pid != 0){ /* parent process */
    wait(NULL); /* wait all child processes */

    printf("\nParent: All children have exited.\n");
    .
    .
    /* cleanup semaphores */
    sem_destroy(&sem);      
    exit(0);
}
else{ /* child process */
    sem_wait(&sem);     /* P operation */
    printf("  Child(%d) is in critical section.\n",i);
    sleep(1);
    *p += i%3;  /* increment *p by 0, 1 or 2 based on i */
    printf("  Child(%d) new value of *p=%d.\n",i,*p);
    sem_post(&sem);     /* …
Run Code Online (Sandbox Code Playgroud)

c linux fork semaphore shared-memory

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

在数组上使用迭代器

它在C++ Primer中有说明

在C++中,指针和数组紧密交织在一起.特别是,正如我们将看到的,当我们使用数组时,编译器通常会将数组转换为指针.

我想使用迭代器来打印数组.下面的程序运行正常但是当我尝试打印时,arr2或者arr3如果我没有弄错,哪种类型int *,我得到一个错误(判断&运算符意味着下面的参考).

error: no matching function for call to ‘begin(int*&)’

int main(int argc, char** argv) {

    int arr[] = {0,1,2,3,4,5,6,7,8,9};
    auto arr2 = arr;
    auto arr3(arr);   // I think arr2 and arr3 are of same type

    for(auto it = std::begin(arr) ; it != std::end(arr) ; ++it)
        std::cout << *it << " ";
    std::cout << std::endl;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

考虑到该语句,如果数组被编译器转换为指针,该程序如何用于打印arr使用的内容,std::begin()并且std::end() 不起作用arr2或者 …

c++ arrays pointers iterator c++11

16
推荐指数
1
解决办法
8638
查看次数

浮点优化 - 指南

我们需要通过在C/C++中实现特定算法来解决的大多数科学计算问题要求精度远低于双精度.例如1e-6,1e-7精度覆盖99%的情况下,对ODE求解或数值积分.即使在我们确实需要更高精度的极少数情况下,通常数值方法本身也会在我们梦想达到接近双精度的精度之前失败.示例:即使在求解标准nostiff常微分方程时,由于舍入误差,我们也不能期望简单Runge-Kutta方法的1e-16精度.在这种情况下,双精度要求类似于要求更好地逼近错误答案.

然后,在大多数情况下,积极的浮点优化似乎是一个双赢的局面,因为它使您的代码更快(更快!)并且它不会影响您的特定问题的目标准确性.也就是说,确保特定的实现/代码对fp优化是稳定的似乎非常困难.古典(有点令人不安)的例子:GNL,GNU科学图书馆,不仅是市场上的标准数字图书馆,而且它是一个写得很好的图书馆(我无法想象自己做得更好).但是,GSL对fp优化不稳定.实际上,例如,如果使用intel编译器编译GSL,那么除非-fp-model strict打开关闭fp优化的标志,否则其内部测试将失败.

因此,我的问题是:是否存在编写代码的一般准则,这些代码对于积极的浮点优化是稳定的.这些指南语言(编译器)是否具体.如果是这样,那么C/C++(gcc/icc)的最佳实践是什么?

注1:这个问题不是询问gcc/icc中的fp优化标志是什么.

注2:这个问题不是询问有关C/C++优化的一般指导原则(比如不要将虚函数用于大量调用的小函数).

注3:这个问题不是要求大多数标准fp优化列表(如x/x - > 1).

注4:我坚信这不是类似于传统的"最酷的服务器名称"的主观/偏离主题的问题.如果您不同意(因为我没有提供具体的示例/代码/问题),请将其标记为社区维基.我对答案比对获得一些状态点更感兴趣(不是它们不重要 - 你明白了!).

c c++ optimization scientific-computing gsl

13
推荐指数
1
解决办法
1683
查看次数

如何检测给定图形是否包含包含其所有节点的循环?建议的算法是否有任何缺陷?

我有一个连接的,非定向的图,有N个节点和2N-3边.您可以考虑将图形构建到现有的初始图形上,该图形具有3个节点和3个边缘.每个节点都添加到图表上,并与图中的现有节点有2个连接.当所有节点都添加到图形中时(总共添加N-3个节点),构建最终图形.

最初我被问到,这个图中可以访问一次的最大节点数是多少(初始节点除外),即给定图的最大哈密顿路径中包含的最大节点数是多少?(好吧,说最大哈密顿路径不是一个有效的短语,但考虑到问题的本质,我需要找到一次访问的最大节点数,并且行程在初始节点结束.我认为它可以被认为是子图是哈密顿量的,并且由最大节点数组成,因此最大可能的哈密顿路径).

由于我没有被要求找到路径,我应该首先检查是否存在给定数量节点的哈密顿路径.我知道平面图和循环图 s(C n)是哈密​​顿图(我也知道哈密​​顿图的Ore定理,但我将要研究的图不会是一个概率很大的密集图,因此使得Ore定理很漂亮在我的情况下没用.)因此,我需要找到一种算法来检查图是否是循环图,即是否存在包含给定图的所有节点的循环.

由于DFS用于检测周期,我认为对DFS的一些小操作可以帮助我检测我正在寻找的内容,如跟踪已探索的节点,最后检查所访问的最后一个节点是否与初始节点有连接.不幸的是,我无法用这种方法取得成功.

我尝试的另一种方法是排除节点,然后尝试从其他相邻节点开始到达其相邻节点.根据所选择的相邻节点,该算法可能无法给出正确的结果.

我几乎被困在这里.你能帮我想一下另一个算法来告诉我图是一个循环图吗?

编辑

我在评论的帮助下意识到了(感谢你nm):

循环图由单个循环组成,具有N个边和N个顶点.如果存在包含给定图的所有节点的循环,那就是哈密顿循环. - nm

实际上正在寻找哈密尔顿路径,我不打算这样做:)在第二个想法,我认为在构建它时检查图的哈密尔顿性质将更有效,这也是我也在寻找:时间效率.

经过一番思考后,无论节点数量是多少,由于节点添加标准,图形似乎都是哈密顿量.问题是我无法确定,我无法证明这一点.以这种方式添加节点,即添加具有将添加的节点连接到现有节点的2条边的新节点,是否会改变图的哈密顿特性?如果它不改变汉密尔顿属性,怎么会这样?如果它确实改变了,那又如何呢?谢谢.

编辑#2

我再次意识到,按照我描述的方式构建图形可能会改变哈密顿特性.考虑如下输入:

1 3
2 3
1 5
1 3
Run Code Online (Sandbox Code Playgroud)

这些输入表示第4个节点连接到节点1和节点3,第5个节点连接到节点2和节点3...

第4和第7个节点连接到相同的节点,从而将可以访问的最大节点数减少一次,如果我检测到这些冲突(包括输入,例如3 3,这是您建议的示例)因为问题表明新添加的边连接到其他2个节点)并且从N开始降低最大节点数,我相信我可以得到正确的结果.

看,我不选择连接,它们是给我的,我必须找到最大值.节点数量.

我认为在构建图形时计算相同的连接并从N中减去相同连接的数量会得到正确的结果吗?你能证实这个或者这个算法存在缺陷吗?

language-agnostic algorithm graph hamiltonian-cycle cyclic-graph

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

C++中的rand()和srand()

在C++中生成随机数的基础是什么?

那背后有一些逻辑或原理吗?

数字是否完全随机生成?

假设我正在运行此程序:

#include <iostream.h>
#include <stdlib.h>
#include <time.h>

int main()
{
    /*
    Declare variable to hold seconds on clock.
    */
    time_t seconds;
    /*
    Get value from system clock and
    place in seconds variable.
    */
    time(&seconds);
    /*
    Convert seconds to a unsigned
    integer.
    */
    srand((unsigned int) seconds);
    /*
    Output random values.
    */
    cout<< rand() << endl;
    cout<< rand() << endl;
    cout<< rand() << endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

它显示的内容:http: //img14.imageshack.us/img14/1538/98271820.png

它显示205两次.

c++ random

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

静态变量和全局变量都驻留在数据段中.尽管如此,静态变量的范围有限.为什么?

在典型的C程序中,静态变量和全局变量都驻留在数据段上.静态变量的范围仍限于文件.相反,可以从任何地方访问全局变量.为什么会发生这种情况,尽管它们都存在于同一个内存中?

c

7
推荐指数
2
解决办法
1427
查看次数

我希望cin读到'\n',但我不能使用getline

我有一个以下格式的文本文件:

info
data1 data2
info
data1 data2 data3 data4...
Run Code Online (Sandbox Code Playgroud)

问题是:数据的计数(和长度)可能非常大,并在getline()使用时导致运行时问题.所以我无法将整行读入std::string.我尝试了以下方法:

for(int i=0; i<SOME_CONSTANT ; i++){
    string info, data;

    cin >> info;

    while(cin.peek() != '\n' && cin >> data){
         // do stuff with data
    }
}
Run Code Online (Sandbox Code Playgroud)

但是cin.peek()没有做到这一点.信息被读入while循环中的数据并且程序会混乱.我怎样才能解决这个问题?

c++ string io newline cin

7
推荐指数
1
解决办法
334
查看次数