小编fox*_*cub的帖子

在循环中擦除unordered_map中的元素

StackOverflow上有几个答案表明以下循环是一种很好的方法来擦除std::unordered_map满足某些谓词的元素pred:

std::unordered_map<...> m;
auto it = m.begin();
while (it != m.end())
{
    if (pred(*it))
        it = m.erase(it);
    else
        ++it;
}
Run Code Online (Sandbox Code Playgroud)

我对C++ 11(而不是C++ 14)特别感兴趣,而cppreference.com上的以下不祥之处表明上述循环依赖于未定义的行为,并且可能在C++ 11中无效:

保留未擦除元素的顺序(这使得可以在迭代容器时擦除单个元素)(从C++ 14开始)

另请参见标题2356.无序关联容器中擦除的稳定性,其中包含对第754页的工作草案N3797第14项的请求的措辞更改(附加短语开头",并保留相对顺序......").

这个措辞与N3797有关.

按照指示修改[unord.req],p14:

-14- insert和emplace成员不应影响对容器元素的引用的有效性,但可能使容器的所有迭代器无效.擦除成员应仅使迭代器和对已擦除元素的引用无效,并保留未擦除元素的相对顺序.

如果我对cppreference.com的注释的解释是正确的,并且上面的循环依赖于C++ 11中的未定义行为,那么在C++ 11中解决这个问题的最有效方法是什么?

c++ unordered-map c++11

21
推荐指数
3
解决办法
4862
查看次数

typedef改变了意义

当我编译以下代码片段时 g++

template<class T>
class A
{};

template<class T>
class B
{
    public:
        typedef A<T> A;
};
Run Code Online (Sandbox Code Playgroud)

编译告诉我

error: declaration of ‘typedef class A<T> B<T>::A’
error: changes meaning of ‘A’ from ‘class A<T>’
Run Code Online (Sandbox Code Playgroud)

另一方面,如果我改变typedef

typedef ::A<T> A;
Run Code Online (Sandbox Code Playgroud)

一切都很好g++.Clang ++ 3.1并不关心任何一种方式.

为什么会这样?并且是第二个行为标准?

c++ typedef

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

在n log n时间内混合链表的算法

我正在尝试使用分而治之算法来混合链表,该算法随后在线性(n log n)时间和对数(log n)额外空间中随机混洗链表.

我知道我可以做一个类似于可以在一个简单的数组中使用的Knuth shuffle,但是我不知道如何用分而治之的方式做到这一点.我的意思是,我实际上分裂了什么?我只是划分到列表中的每个单独节点,然后使用一些随机值将列表随机组合在一起?

或者我给每个节点一个随机数,然后根据随机数在节点上进行合并?

algorithm shuffle linked-list divide-and-conquer

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

并发可变优先级队列

是否存在并发可变优先级队列?理想情况下,我正在寻找一个C++实现,但是,对于初学者来说,指向算法的指针会非常有用.

要清楚,我正在寻找一个优先级队列,我可以调整元素的优先级.特别是,TBB concurrent_priority_queue不提供必要的功能.(就此而言,priority_queue即使我们忽略并发性,STL也不会.)Boost.Heap库提供了我想要的串行功能,但没有并发性.当然,我正在寻找比在每次操作中锁定整个队列更细粒度的东西.

c++ algorithm concurrency priority-queue data-structures

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

加载可执行文件或执行库

SO有大量 关于如何执行库或动态加载可执行文件的问题据我所知,所有答案都归结为:将可执行文件编译为位置无关代码并使用. 这非常有效,并且在 macOS 上仍然有效,直到glibc 最近发生更改,明确禁用了PIE。例如,此更改现在出现在 ArchLinux 上当前版本的 glibc (2.30) 中,并且尝试位置无关的可执行文件会出现错误:“无法动态加载位置无关的可执行文件”。dlopendlopendlopen

很难猜测是什么促使了如此彻底的改变,破坏了如此多的代码和有用的用例。(Patchwork 和 Bugzilla 的解释对我来说没有多大意义。)但是现在有一个问题:如果你想创建一个同时也是动态库的可执行文件该怎么办,反之亦然?

其中一条评论链接了一个解决方案。在这里为后代复制它:

#include <stdio.h>
#include <unistd.h>

const char service_interp[] __attribute__((section(".interp"))) = "/lib/ld-linux-x86-64.so.2";

extern "C" {

void lib_entry(void)
{
  printf("Entry point of the service library\n");    
  _exit(0);
}

}
Run Code Online (Sandbox Code Playgroud)

编译生成g++ -shared test-no-pie.cpp -o test-no-pie -Wl,-e,lib_entry一个也可以在 Linux 上执行的共享对象(动态库)。

我有两个问题:

  1. 如果我想传递命令行参数怎么办?如何修改此解决方案以使其接受arc,argv
  2. 还有其他选择吗?

linux executable glibc shared-libraries dlopen

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

在LaTeX的算法环境中格式化注释

我想在LaTeX中排版一个算法.我正在使用算法包和环境来做到这一点.一切都很好,除非我添加注释(使用\ COMMENT),它们会在语句后立即输出.我希望所有的评论都要一致(并且与陈述相抵消).有一个简单的方法吗?

在HTML的前期"再现"PDF输出,我希望:

if condition then
   something         # comment 1
else
   something else    # comment 2
Run Code Online (Sandbox Code Playgroud)

而不是

if condition then
   something  # comment 1
else
   something else  # comment 2
Run Code Online (Sandbox Code Playgroud)

algorithm formatting latex

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

Boost.Serialization和Boost.Python双向泡菜

我有一个使用Boost.Serialization的C++库.我正在使用Boost.Python为这个库创建Python绑定.很明显如何为Boost.Python创建一个使用Boost.Serialization的pickle套件(使用Boost.Serialization保存到一个字符串,并将该字符串返回给Python).

我想要的是相反的:给定a boost::python::object,我想要一个serialize(...)函数来调用Python的pickle.dumps()函数并序列化结果字符串.(想象一下std::vector<boost::python::object>.当我序列化这个向量时,Boost.Serialization会调用辅助serialize()函数.)这可能吗?更好的是,是否可以使用cPickle和绕过将控件提供给Python解释器?

c++ python boost pickle boost-serialization

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

TBB具有一个任务的固定线程数,对其他任务具有默认值

我想在一组块上并行执行for循环(使用TBB),其中每个块将使用用户提供的函数进行处理.通常情况下,我会这样做tbb::parallel_for().由于各种原因,我希望能够将处理块的线程数限制为规定的数量,然后调用它j.通常情况下,我会这样做tbb::task_scheduler_init(j).

但是,我希望用户可以选择使用TBB,具体来说,让用户提供的功能使用但仍有许多内核.所以我认为tbb::task_scheduler_init()是出局.我能看到的唯一解决方案是让用户调用tbb::task_scheduler_init()(或一起忽略它),并在正常的for循环中自行旋转我自己的j实例tbb::tbb_thread.我错过了什么吗?在TBB中有更自然的方法吗?是否有某种分层版本tbb::task_scheduler_init()

c++ multithreading tbb

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

可变基类的初始化

以下代码不起作用.它的目的是将参数传递给可变参数基类.这是可能的,如果是这样,实施它的正确方法是什么?(Clang的错误信息是:an initializer for a delegating constructor must appear alone,我不明白.)

template<class... Visitors>
class Visited: public Visitors...
{
    public:
        template<class F>
        Visited(const F& f): F(f)               {}

        template<class F, class... Rest>
        Visited(const F& f, const Rest&... r):
            F(f), Visited(r...)                       {}
};

struct A {};
struct B {};
struct C {};

int main()
{
    A a;
    B b;
    C c;
    Visited<A,B,C> v(a, b, c);
}
Run Code Online (Sandbox Code Playgroud)

c++ templates variadic c++11

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

重复,但仍然使用标准输出

我可以用dup2(或fcntl)做一些魔法,所以我将stdout重定向到一个文件(即,写入描述符1的任何东西都会转到文件中),但是如果我使用了其他一些机制,它会转到终端输出?如此松散:

  int original_stdout;
  // some magic to save the original stdout
  int fd;
  open(fd, ...);
  dup2(fd, 1);
  write(1, ...);  // goes to the file open on fd
  write(original_stdout, ...); // still goes to the terminal
Run Code Online (Sandbox Code Playgroud)

c unix file dup2

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

检查是否存在(重载)成员函数

关于检查成员函数是否存在,有许多已回答的问题:例如, 是否可以编写模板来检查函数是否存在?

但是,如果函数重载,此方法将失败.这是一个稍微修改过的代码,来自该问题的最高评价答案.

#include <iostream>
#include <vector>

struct Hello
{
    int helloworld(int x)  { return 0; }
    int helloworld(std::vector<int> x) { return 0; }
};

struct Generic {};


// SFINAE test
template <typename T>
class has_helloworld
{
    typedef char one;
    typedef long two;

    template <typename C> static one test( decltype(&C::helloworld) ) ;
    template <typename C> static two test(...);


public:
    enum { value = sizeof(test<T>(0)) == sizeof(char) };
};


int
main(int argc, char *argv[])
{
    std::cout << has_helloworld<Hello>::value << std::endl;
    std::cout …
Run Code Online (Sandbox Code Playgroud)

c++ templates sfinae c++11

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