小编xun*_*ang的帖子

如何在C++中生成随机矩阵?

我想生成一个具有固定稀疏性和随机索引和值的矩阵.

为了简化问题,以数组为例:生成一个只有3个非零值位置的arr [10].如果我只是逐个随机选择这3个索引,那么算法的效率就会因为重复而变坏.

更难,我还想生成一个排名为k的随机矩阵,因为空cols和行可能会导致我的代码出错...这次如何制作?

谢谢!

c c++ random algorithm random-sample

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

为什么stl vector不能包含coroutine对象?

我在boost1.53中使用coroutine,请参阅下面的代码:

boost::coroutines::coroutine<int()> f(std::bind(foo, ...));
std::vector<decltype(f)> container; // it can be compiled
container.push_back(f); // compile error
Run Code Online (Sandbox Code Playgroud)

错误:

no matching function for call to ‘std::vector<boost::coroutines::coroutine<int(),0> >::vector(paracel::coroutine<int>&)’
Run Code Online (Sandbox Code Playgroud)

更新:错误发生,因为'boost :: coroutines :: coroutine'中没有复制构造/运算符,这里的情况是我只想将'f'保存到将索引映射到'f'的容器中.

我也试过unordered_map和emplace_back,它仍然无法正常工作!

如何使它在C++中工作?

Update2:我尝试了vector,unordered_map,与emplace_back,push_back,std :: move一起映射,并且都失败了.但是list和deque在push_back/emplace_back和std :: move中是可以的:

std::deque<decltype(f)> container1;
container.push_back(std::move(f)); // ok
std::deque<decltype(f)> container2;
container.emplace_back(std::move(f)); // ok
std::list<decltype(f)> container3;
container.push_back(std::move(f)); // ok
std::list<decltype(f)> container4;
container.emplace_back(std::move(f)); // ok
Run Code Online (Sandbox Code Playgroud)

为什么?

c++ boost stl coroutine c++11

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

在C++中从输入函数获取参数类型的模板函数出错?

我遇到了一些类似的问题并找到了这个问题:是否有可能找出lambda的参数类型和返回类型?.

我在这个问题的答案中使用代码:

#include <iostream>
#include <tuple>

template <typename T>
struct function_traits : public function_traits<decltype(&T::operator())> {}; 

template <typename ClassType, typename ReturnType, typename... Args>
struct function_traits<ReturnType(ClassType::*)(Args...) const> {
  enum { arity = sizeof...(Args) };

  typedef ReturnType result_type;

  template <size_t i>
  struct arg {   
  typedef typename std::tuple_element<i, std::tuple<Args...>>::type type;
  };  
};
Run Code Online (Sandbox Code Playgroud)

在我的例子中,(lambda)函数是用户定义的,所以我必须使用模板函数来根据用户定义的函数做一些事情,所以我在下面添加一个代理函数:

template <class F>
void proxy(F func) {
  typedef function_traits<decltype(func)> traits;
  typename traits::result_type r;
  traits::arg<0>::type p;                          // compile error
}
Run Code Online (Sandbox Code Playgroud)

我得到以下编译错误:

error: `::type` has not been declared
error: expected `;` …
Run Code Online (Sandbox Code Playgroud)

c++ lambda templates type-traits c++11

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

可以在类中定义构造函数吗?

为什么gcc无法编译下面的代码成功?可以在类中定义构造函数吗?

#include <string>
using std::string;

class Person{
public:
    Person(const string &a, const string &b);
private:
    string name, address;
};

Person::Person(const string &a, const string &b){
    name(a);
    address(b);
}
Run Code Online (Sandbox Code Playgroud)

谢谢!

c++

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

当我新建空间时,一个非常奇怪的分段错误

当我运行我的代码时,存在分段错误.我使用gdb跟踪我的代码并找到下面的错误代码:

(gdb)  
30      wgt_indx_src = new int [num_wgts];

(gdb) 

Program received signal SIGSEGV, Segmentation fault.
0x0000003735e7201e in _int_malloc () from /lib64/libc.so.6
Run Code Online (Sandbox Code Playgroud)

更重要的是,在我的情况下,num_wgts是41472.我尝试如果它小于12398就可以了,但是当它设置为12399时,存在一个sefmentation故障.

我使用valgrind并获得下面的结果:我想问最后两行是否意味着

同样的指示?

==19944== Invalid free() / delete / delete[]
=19944==    at 0x4A04DAC: operator delete[](void*) (vg_replace_malloc.c:256)
==19944==    by 0x4039C1: main (main.C:137)
==19944==  Address 0x4C36030 is 0 bytes inside a block of size 65,536 free'd
==19944==    at 0x4A04DAC: operator delete[](void*) (vg_replace_malloc.c:256)
=19944==    by 0x4032FB: grid::~grid() (grid.C:208)
==19944==    by 0x403929: main (main.C:127)
Run Code Online (Sandbox Code Playgroud)

c++ segmentation-fault

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

C编译器如何在递归期间处理堆栈中的局部变量?

我写了一个简单的二进制搜索程序并遇到问题,请看下面我的三个混淆:

  • 如果我选择icc -g main.cicc -O0 main.c代码返回错误答案,但如果我使用icc -O2 main.c我可以得到正确的答案.

  • 当代码在答案正确mid = (beg + end) / 2;之前定义时,if(beg <= end) {无论我用什么标志来编译它.

  • 我认为问题是mid递归期间堆栈中的局部变量.

帮帮我,谢谢!

#include <stdio.h>
#define MAX 6
int a[MAX] = {1,2,3,4,5,6};
int improved_binary_search(int key, int beg, int end) {
    int mid, temp;
    //mid = (beg + end) / 2;
    if(beg <= end) {
             mid = (beg + end ) /2;
             if(a[mid] == key)
                     return mid;
             if(a[mid] < key)
                     return improved_binary_search(key, …
Run Code Online (Sandbox Code Playgroud)

c recursion stack

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

C++中向量obj的地址是什么?

请参阅以下代码:

#include <vector>
#include <iostream>
int main(int argc, char *argv[]) {
  std::vector<double> obj(10,0);
  std::cout << &obj << std::endl;
  std::cout << &obj[0] << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

我想知道这两个地址之间的区别并谢谢!据我所知,对于一个阵列状a[5],&a<=> &a[0]<=> a.

c++ vector memory-address

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

BSP和MPI有什么区别?

BSP和MPI有什么区别?

我知道Pregel的图形计算框架是基于BSP的.他们为什么不直接使用MPI或开发基于MPI的框架?

c++ parallel-processing mpi graph-algorithm

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

如何在C中找到线指针?

如果我读取二进制文件,我可以使用以下方法找到第n行:

fseek(fp, 4*sizeof(line),SEEK_SET);
Run Code Online (Sandbox Code Playgroud)

但是在C中读取txt文件时,如:

1 1 2.2
2 3 3.001
3 4 5
Run Code Online (Sandbox Code Playgroud)

我无法确保一行的字节大小,因为在实际情况下,double值可以是2.2或3.0001或5.这次我怎样才能找到使用fseek的第n个?

谢谢!

c file-io file-upload file

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

如何在 C++ 中进行惰性构造?

我想在 C++ 类中进行“懒惰构造”,一个简单的方法是这样的:

#include "b.hpp" // class B

class A {

public:
  // invoke B() in b.hpp, this constructor do not actually do init      
  A(int v_in) : v(v_in) {} 

  void foo() {
    if(flag == false) {
      b = create_B_obj();
      flag = true;
    }
  }
private:
  B create_B_obj() {
    // some expensive ops
    //...
  }

private:
  bool flag = false;
  B b;
  int v;
};
Run Code Online (Sandbox Code Playgroud)

但是存在的一个问题是 B 可能不包含默认构造函数 ( B()),那么在这种情况下我该如何做“懒惰构造”呢?

顺便说一句:我项目中的 B 类就像一个套接字,需要进行连接或类似绑定的调用,所以我想把这些昂贵的操作懒惰。

c++ sockets constructor default-constructor lazy-initialization

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

参数传递中std :: forward的用法是什么?

请参阅下面的代码段(请注意,s是一个带有char而不是string的数组):

#include <string>
#include <iostream>
#include <utility>

void func(std::string & s, char a) {
  std::cout << "here1" << std::endl;
  // ...
}

void func(std::string && s, char a) {
  std::cout << "here2" << std::endl;
  // ...
}

template <class T>
void foo(T && s) {
  std::cout << "foo2" << std::endl;
  func(s, ':');
  //func(std::forward<T>(s), ':');
}

int main(int agrc, char *argv[])
{
  //std::string s("a:b:c:d");
  char s[8] = "abcdefg";
  foo(std::move(s));
  std::string s2("abcd")
  foo(s2);
  return 0;  
}
Run Code Online (Sandbox Code Playgroud)

如果我替换func(s, ':')使用std::forward,它没有区别,foo函数将执行完美转发, …

c++ forward perfect-forwarding c++11

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

使用valgrind在C中的堆栈方向的相反结果

我使用valgrind来找出堆栈方向的混乱问题.

看下面的代码,我想知道为什么运算符"p1 + = 0x80;*p1 = 1"有效且运算符"p2 - = 0x80;*p2 = 1"根据valgrind无效写入?

我认为所有的变量都根据操作系统在堆栈中分配,并且它正在增长到较低的地址,所以我认为" - ="是有效的,而"+ ="是无效的,因为它可能比较大到堆栈顶部可能不在堆栈限制中.

#include <stdlib.h>

int main()
{
    int a;
    int *p1 = &a;
    p1 += 0x80;
    int *p2 = &a;
    *p1 = 1;
    p2 -= 0x80;
    *p2 = 1;
    return EXIT_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)

c stack-overflow stack

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