小编qua*_*dev的帖子

为什么要使用std :: mutex而不是boost :: shared_mutex?

我的理解是:std::mutex阻止其他线程,无论他们是否想要读取或写入,而boost::shared_mutex允许多次读取.

所以我的问题是,我是否应该总是选择boost::shared_mutex而不是正常std::mutex来允许并行读取的可能性?使用正常std::mutex感觉就像我否认一些可能的读取吞吐量....?

c++ multithreading boost

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

错误:必须使用括号括起的初始化程序初始化数组

我有一段C++代码:

template <typename WorkType, int Degree = 2> class PolynomialFunction {
 public:
  static constexpr int kNumberCoefficients[] = { 0, 3, 6, 10, 15 };
  static const int kPolyDimension = kNumberCoefficients[Degree];
  ...
 private:
  WorkType polynom_[kPolyDimension];
  ...
Run Code Online (Sandbox Code Playgroud)

哪个编译好之前但突然(可能是新的编译器)它失败并出现以下错误:

./polynomial_function.h:实例化'constexpr const int PolynomialFunction :: kNumberCoefficients []':
./ polynomial_function.h:84:56:需要'const int PolynomialFunction :: kPolyDimension'
./polynomial_function.h : 309: 35 :需要来自'class PolynomialFunction'
./segment.h:
321:17:从这里需要 ./polynomial_function.h:83:24:错误:初始化程序无法确定'PolynomialFunction :: kNumberCoefficients'的
大小./polynomial_function.h: 83:24:error:数组必须用大括号括起来的初始化器初始化
./polynomial_function.h:在'class PolynomialFunction'的实例化中:
./ segment.h:321:17:从这里需要

顺便说一句.第83行是'kNumberCoefficients'的声明,第309行是'polynom_'的声明.任何想法为什么失败?谢谢.

c++ arrays static templates

5
推荐指数
0
解决办法
4185
查看次数

C中的循环优化

我的任务是优化C中的特定for循环.这是循环:

#define ARRAY_SIZE 10000
#define N_TIMES    600000

for (i = 0; i < N_TIMES; i++)
{
    int j;

    for (j = 0; j < ARRAY_SIZE; j++)
    {
        sum += array[j];
    }
}
Run Code Online (Sandbox Code Playgroud)

我应该使用循环展开,循环拆分和指针来加速它,但每次我尝试实现某些东西时,程序都不会返回.这是我到目前为止所尝试的:

for (i = 0; i < N_TIMES; i++) 
{
    int j,k;

    for (j = 0; j < ARRAY_SIZE; j++) 
    {    
        for (k = 0; k < 100; k += 2) 
        {
            sum += array[k];
            sum += array[k + 1];
        }
    } 
}
Run Code Online (Sandbox Code Playgroud)

我不明白为什么程序现在甚至没有返回.任何帮助,将不胜感激.

c optimization loops

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

如何使用 UNIX 获取列表中唯一值的频率计数?

我有一个文件,列表中有几千个域名。我使用 uniq 命令轻松生成了一个仅包含唯一名称的列表。现在,我想查看唯一列表中的每个项目在原始非唯一列表中出现的次数。我认为用这个循环应该很容易做到,但我遇到了麻烦:

for name in 'cat uniques.list'; do grep -c $name original.list; done > output.file
Run Code Online (Sandbox Code Playgroud)

出于某种原因,它吐出的结果显示了唯一文件和原始文件的某些内容(老实说不确定是什么)。

我觉得我在这里忽略了一些非常简单的事情。任何帮助表示赞赏。

谢谢!

unix bash

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

cpp向量用于循环终止条件错误

编译以下函数时,以下是编译错误.为什么yt != endIx在第二轮for循环非法.

错误C2678:二进制'!=':找不到运算符,它接受类型为'std :: _ Vector_iterator >>'的左手操作数(或者没有可接受的转换)

void printDebug(vector <int>  ar)
{
    for (auto it = ar.begin(); it != ar.end(); it++)
    {
        auto endIx = ar.end() - it;
        for (auto yt = ar.begin(); yt != endIx ; yt++)
        {
            cout << *it << " : " << endIx ;
        }
        cout << endl;
    }
}
Run Code Online (Sandbox Code Playgroud)

为了避免混淆,我将auto end迭代器重命名为endIx;

c++ c++11

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

私有静态类成员

当我们声明一个成员变量static时,它在该类的所有实例之间共享.我听说你应该想到属于类本身的变量,而不是任何实例.这让我们初始化变量而不实例化类的任何对象,这是有道理的.

class Something
{
  public:
    static int s_nValue;
};

int Something::s_nValue = 1;
Run Code Online (Sandbox Code Playgroud)

但是为什么我们允许初始化私有静态成员?

class Something
{
   private:
      static int s_nValue;
};

int Something::s_nValue = 1;
Run Code Online (Sandbox Code Playgroud)

当我们谈论静态成员时,私人甚至意味着什么?

c++

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

在2D std :: vector C上每个c ++ 11都不起作用?

初始化称为矩阵的2D矢量.

std::vector<std::vector<int>> matrix(512,std::vector<int>(512));
Run Code Online (Sandbox Code Playgroud)

现在我想调整它的大小:

这有效:

    matrix.resize(50);
    for(int i = 0; i<matrix.size() ; i++)
        matrix[i].resize(50);
Run Code Online (Sandbox Code Playgroud)

这不起作用:

    matrix.resize(50);
    for(auto ele : matrix)
        ele.resize(50);
Run Code Online (Sandbox Code Playgroud)

for(auto ele : container)在其他地方使用,我应该使用Microsoft Visual C++编译器12.0支持C++ 11.

c++ foreach vector c++11

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

为什么重载在Java中与继承一起工作?

我们知道重载对C++中的派生类不起作用.但为什么这种行为在java中有所不同?意味着为什么重载适用于java中的派生类?请考虑以下Stroustrup博士的常见问题解答中的示例

#include <iostream>
using namespace std;
class Base
{
public:
    int f(int i)
    {
        cout << "f(int): ";
        return i+3;
    }
};
class Derived : public Base
{
public:
    double f(double d)
    {
        cout << "f(double): ";
        return d+3.3;
    }
};
int main()
{
    Derived* dp = new Derived;
    cout << dp->f(3) << '\n';
    cout << dp->f(3.3) << '\n';
    delete dp;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

该程序的输出是:

f(双):6.3

f(双):6.6

而不是假定的输出:

f(int):6

f(双):6.6

但如果我们在java中执行此程序,则输出会有所不同.

class Base
{
    public int f(int i)
    {
        System.out.print("f …
Run Code Online (Sandbox Code Playgroud)

c++ java inheritance

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

如何计算向量的向量

如何std::count根据最里面向量的第二个值来计算向量向量?

我将向量声明为:

vector< vector<int> > distance(data.size(),vector<int>(3)); 
Run Code Online (Sandbox Code Playgroud)

c++ stdvector

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

如何正确增加使用cv :: findContours找到的矩形的大小

我有一个函数,用于cv::findContours围绕一个或多个检测到的对象创建矩形,然后我想用它来存储每个对象的裁剪图像.我的问题是cv::findContours在对象周围绘制矩形,但由于我还需要围绕对象的部分背景,我想增加每个矩形的大小.

这可以通过类似的方式轻松完成rectangleVector[i] += cv::Size(10, 10).但问题是,如果检测到的对象正好位于图像的一角,并且我增加了矩形的大小,然后使用矩形来裁剪刚检测到的对象的图像,程序将崩溃,因为矩形不在图像区域了.

我需要以某种方式检查矩形的位置,然后只有增加它的大小,如果生成的矩形不会超出范围.

请在下面找到我的功能.

void ActualRec::objectDetection(){
    Mat temp;
    thresholdedImage.copyTo(temp);
    vector<vector<Point> > contours;
    vector<Vec4i> hierarchy;
    findContours( temp, contours, hierarchy, CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE );

    if (contours.size()<5){    
        vector<vector<Point>> contours_poly( contours.size() );
        vector<Rect> boundRect( contours.size() );
        for( int i = 0; i < contours.size(); i++ ){
            approxPolyDP( Mat(contours[i]), contours_poly[i], 3, true );
            boundRect[i] = boundingRect( Mat(contours_poly[i]) );
        }


        for( int i = 0; i< contours.size(); i++ ){
            //won't do the job..
            Point BRx = boundRect[i].br();
            Point …
Run Code Online (Sandbox Code Playgroud)

c++ opencv

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