小编Slu*_*ger的帖子

为什么我的strCopy实现工作?

这是strCopy的一个实现

void strcopy2(char *dst, char const *src){
    while ((*dst++ = *src++))
        ;
}
Run Code Online (Sandbox Code Playgroud)

我们的教授要求我们在不使用指针的情况下重现这段代码,所以我想出了以下函数:

void strcopy(char dst[], char const src[]){
    size_t i = 0;
    while (dst[i] = src[i++])
        ;
}
Run Code Online (Sandbox Code Playgroud)

它运行良好,但我意识到,在引擎盖下,函数必须仍然使用指针,因为我们无处可返回任何值.换句话说,我虽然最后一个函数会使用pass by value但显然并非如此.那么在水下发生了什么,这两种方法之间究竟有什么区别吗?

c++

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

多重继承.实现`+ =`的继承模型背后的想法是什么?

对于C++类,我想设计一个类层次结构,处理二进制运算+=-=.所需的层次结构(每个问题要求)描述如下.我们有两个类AdditionSubtraction.这些是类的基类Binops.然后一个类Operations继承自Binops.所以图表看起来像这样

       Operations
           |
           ?
        Binops 
         |  |
         |  |
     +---+  +---+
     ?          ?
  Addition  Subtraction
Run Code Online (Sandbox Code Playgroud)

Binops是朋友班Operations.需要以下成员函数:Operations实现私有函数

void add(Operations const &rhs);
void sub(Operations const &rhs);
Run Code Online (Sandbox Code Playgroud)

而且这个课Addition需要实施

Addition::operator+=(Operations const &rhs)
Run Code Online (Sandbox Code Playgroud)

同样的Subtraction课程.

我对这个设计的实现以及它背后的想法都有疑问.

我看到它的样子,一旦这一框架已经准备好,例如像其他类Matrix类可以从继承Operations类,然后我们做Matrix的一个朋友Operations这样Matrix可以使用+=等等.然后,我们也只会实现add在功能Operations+=操作将然后为Matrix全班工作.但后来我们为什么不干脆直接在+=运营商Operations,甚至Matrix …

c++ oop inheritance

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

在 template<class It> 函数中,It 是一个迭代器,我可以使 It::value_type 同时适用于 vector::iterators 和 array::iterators 吗?

我一直在编写一些采用名为 的模板的函数It,该模板应该是一个迭代器。然后我使用It::value_type来实现某些功能。这对于我尝试过的大多数容器都有效,但对于std::array. 如果我确实使用了,std::array我会收到错误

\n
error: \xe2\x80\x98long unsigned int*\xe2\x80\x99 is not a class, struct, or union type\n
Run Code Online (Sandbox Code Playgroud)\n

所以我看到了问题, 的迭代器std::array只是一个指针,这对我来说是有意义的。因此它没有::value_type定义。但是我怎样才能制作我的模板化代码,以便它适用于std::arraystd::vectorstd::list

\n

我做了一个 MWE,其中的函数只是一个愚蠢的病态例子,显示了我的问题

\n
#include <vector>\n#include <iostream>\n#include <array>\n\ntemplate <class It>\nvoid print_accumulate(It first, It last) {\n    typename It::value_type result{};    // What do I write here??\n    while (first != last) {\n        result += *first;\n        ++first;\n    }\n    std::cout << result << "\\n";\n}\n\nint main() {\n    std::vector<size_t> v …
Run Code Online (Sandbox Code Playgroud)

c++ templates

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

使用 boost::asio::thread_pool 的 C++ 线程池,为什么我不能重用我的线程?

我正在尝试boost::asio::thread_pool在我的应用程序中创建线程池。我创建了以下玩具示例,看看我是否理解它是如何工作的,但显然不明白:)

#include <boost/asio/post.hpp>
#include <boost/asio/thread_pool.hpp>
#include <boost/bind.hpp>
#include <iostream>

boost::asio::thread_pool g_pool(10);

void f(int i) {
    std::cout << i << "\n";
}

int main() {
    for (size_t i = 0; i != 50; ++i) {
        boost::asio::post(g_pool, boost::bind(f, 10 * i));
        g_pool.join();
    }
}
Run Code Online (Sandbox Code Playgroud)

程序输出

0
Run Code Online (Sandbox Code Playgroud)

我对两件事感到困惑:第一,如果我正在等待线程完成使用g_pool.join(),为什么我不能在下一次迭代中重用这些线程。10,20,30,...即,我希望还能看到在后续迭代中打印的数字等。

其次,我正在创建一个大小为 10 的线程池,为什么我至少没有看到 10 个输出呢?我无法理解这个问题。

请告诉我哪里出错了,先谢谢了!

c++ multithreading boost boost-asio threadpool

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

这个函数是否使用了haskell的惰性评估

我编写了以下函数来判断数字是否为素数.

isPrime :: Int -> Bool
isPrime n = and (map (\x -> (n `mod` x > 0))[2..(intSquareRoot n)])

intSquareRoot :: Int -> Int
intSquareRoot n = intSq n
  where
    intSq x
      | x*x > n = intSq (x - 1)
      | otherwise = x
Run Code Online (Sandbox Code Playgroud)

我刚刚开始使用Haskell,所以这段代码可能对任何受过使用训练的人都是可怕的.但是,我很好奇这段代码是否使用了Haskell的懒惰评估.这部分

(map (\x -> (n `mod` x > 0))[2..(intSquareRoot n)])
Run Code Online (Sandbox Code Playgroud)

将创建一个布尔列表,如果只有其中一个是假的(所以如果一个介于2和n的sqrt之间的数字除以n)那么使用'和'函数整个事件是假的.但我认为将首先创建整个列表,然后使用'和'函数.这是真的?如果是这样,我怎样才能通过使用延迟求值来加快速度,以便函数停止并在找到n的第一个除数后返回false.在此先感谢您的帮助!

haskell functional-programming lazy-evaluation

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

为什么我的Miller Rabin算法不起作用(Haskell)?

我在Haskell中实现了Miller Rabin测试.我试图严格遵循例如在Miller Rabin测试的维基百科条目中给出的伪代码.现在我在网上发现,对于某些证人的选择,测试是确定性的,直到某些给定的界限.我对2 ^ 64以下的素数很感兴趣,所以我在这篇文章中找到了足够的界限 我需要哪些证人才能进行Rabin-Miller测试,最多可达10?.但是,代码似乎适用于我测试过的大多数小素数,但是对于一些较大的素数而言却失败了.例如,我尝试了十位数的素数5915587277,测试返回false.我认为我的实施是正确的,但希望有人可以发现我犯了错误并且误解了MR测试.在此先感谢您的帮助.此外,抱歉看起来凌乱的代码.

isPrime :: Int -> Bool
isPrime n = millerRabinTest n (factorizeN (n-1))

{- factorizeN finds a number s and odd number d such that n -1 = (2^s)d by 
succesively dividing n by two if it is even. -}
factorizeN :: Int -> (Int, Int)
factorizeN n = fN n 0
  where
    fN n s | even n    = fN (n `div` 2) (s + 1)
           | otherwise = (n,s)

{- this is …
Run Code Online (Sandbox Code Playgroud)

algorithm primes haskell primality-test

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

如何使用过滤器从Haskell中的列表中过滤出特定数字的所有倍数

我知道我可以创建一个函数来执行此操作,但我可以使用前奏中的过滤器函数.我可以轻松过滤所有大于3的数字,例如从列表中使用

filter (>3) [list]
Run Code Online (Sandbox Code Playgroud)

但我想要类似的东西

filter (not (.. `mod` 4 == 0)) [list]
Run Code Online (Sandbox Code Playgroud)

过滤掉所有四倍的倍数.我把..放在这里,因为我不知道那里有什么.有什么方法可以使用过滤器功能这样做,还是我应该自己做功能呢?提前致谢

haskell pointfree

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

使用 BSP 库时 g++ 的未定义引用错误,但 gcc 的未定义引用错误

我正在为我的一门课程制作一个并行程序。现在最初它是用 C 编写的,并且一切正常。然后我们将其全部更改为 C++,当我尝试编译该程序时,突然间出现了一些错误。我在并行部分使用包 mcbsp(多核 BSP)。这是程序

#include <stdio.h>
#include <stdlib.h>
#include <mcbsp.h>

void sieve(){
  return ;
}

main(int argc, int **arhv){
  bsp_begin(5);
  printf("%d\n",bsp_pid());
  bsp_end();
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

所以我用这个内容制作了一个文件 aaa.c 和 aaa.cpp 。然后当我在终端中输入时

gcc aaa.c -MMD -g -I../bsp/include -L../bsp/lib -lmcbsp1.2.0 -lpthread
Run Code Online (Sandbox Code Playgroud)

它编译得很好,程序按预期运行(打印内核的 id)。但是,当我输入

g++ aaa.cpp -MMD -g -I../bsp/include -L../bsp/lib -lmcbsp1.2.0 -lpthread
Run Code Online (Sandbox Code Playgroud)

它给出了以下反馈

/tmp/ccH3uox9.o: In function `main':
/home/teun/Documents/C/BSP/Sieve/sieve/aaa.cpp:10: undefined reference to `bsp_begin(unsigned int)'
/home/teun/Documents/C/BSP/Sieve/sieve/aaa.cpp:11: undefined reference to `bsp_pid()'
/home/teun/Documents/C/BSP/Sieve/sieve/aaa.cpp:12: undefined reference to `bsp_end()'
collect2: error: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)

我已经坚持了大约一个小时,这真的很令人沮丧。我必须承认,我几乎没有使用 C++ …

c++ compiler-errors

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

在Matlab中着色Mandelbrot集

我制作了一个程序来计算mandelbrot集中的点.对于不属于mandelbrot集的点,我会跟踪起始点发散多少次迭代到幅度大于2的位置.基本上对于不在mandelbrot集中的每个点,我都有一个计数器,它的速度有多快在1到256的范围内发散.想要做的就是根据它的发散速度给每个点一个颜色.例如,在255次迭代中发散的点可以是白色,并且它发散的越快,它被着色的越多.我已经做了一个简单的调整,其中在20多个步骤中发散的发散点被涂成红色,在10-19步中发散的发散点是蓝色的,而在5-9步中发散的发散点是黄色的,它看起来像这样.

在此输入图像描述

现在我不能为所有可能的255分歧率做到这一点.如何制作一个毕业比例并在Matlab中实现它.在此先感谢您的帮助.如果有人想知道更多,请询问.谢谢!

编辑我很抱歉,但图像似乎不起作用.基本上我需要它.我正在绘制点,每个点分配1到255之间的值,我希望颜色根据分配给它的值逐渐改变.谢谢!

matlab mandelbrot

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

是否有这个特定编程挑战的名称,我们可以做得更好O(N ^ 2)?

这是问题所在.有N个人,其中一个是国王.每个人都认识国王,而国王却不认识任何人.是否有一个名称或一些理论如何最好地找出国王的数量是这种情况,因为我们有一个功能,以确定我是否知道人j.当然,我们可以简单地为每个人检查哪些人不认识任何人,然后检查每个人都知道哪一个.但这是订单N ^ 2,如果有更快的东西,我很好奇.提前致谢

algorithm

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

将std :: vector <size_t>数组发送到函数和打印时出错

考虑以下程序.

#include <iostream>
#include <vector>

void printEm(std::vector<size_t>* array){
  std::cout << array[0] << "\n";
}

  int main(){
  std::vector<size_t> array;

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

出于某种原因,每当我编译这个,我得到三页值或错误,我不知道为什么.我认为类型std :: vector可能与cout的期望值不匹配.有谁知道如何解决这一问题?我会发布错误消息,但它们真的会永远存在.谢谢!

c++

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

在计算字符串数组c ++中的元素时的分段错误

我正在尝试解决topcoder上发现的旧问题.我立刻陷入了试图找到字符串数组中的元素数量.这是我的代码

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string>

using namespace std;

class MiniPaint {
private:
    size_t numLines;    

public:
    int leastBad(string picture[], int maxStrokes) {
        numLines = 0;
        while (!picture[numLines].empty()) {
            numLines++;
        }

        cout << numLines << '\n';


        return 0;
    }

};


int main() {

    MiniPaint instance;
    string picture[] = {"BBBBBBBBBBBBBBB", "WWWWWWWWWWWWWWW", "WWWWWWWWWWWWWWW", "WWWWWBBBBBWWWWW"};


    instance.leastBad(picture, 10);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这段代码给了我一个分段错误.出现问题,代码有点过分,只是计算元素数量的功能,但当然我想扩展类以包含更多功能.如果有人能解释这里出了什么问题,我将不胜感激!提前致谢.

编辑:当我扩展代码时

 cout << picture[numlines] << '\n';
Run Code Online (Sandbox Code Playgroud)

在while循环中,为了显示数组中的实际元素,首先显示四个正确的字符串然后以某种方式无限地向终端打印空格.所以问题在于某个事实

picture[4].empty()
Run Code Online (Sandbox Code Playgroud)

即使图片只有四个元素,也不会返回true.

c++ arrays string

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