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中解决这个问题的最有效方法是什么?
当我编译以下代码片段时 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并不关心任何一种方式.
为什么会这样?并且是第二个行为标准?
我正在尝试使用分而治之算法来混合链表,该算法随后在线性(n log n)时间和对数(log n)额外空间中随机混洗链表.
我知道我可以做一个类似于可以在一个简单的数组中使用的Knuth shuffle,但是我不知道如何用分而治之的方式做到这一点.我的意思是,我实际上分裂了什么?我只是划分到列表中的每个单独节点,然后使用一些随机值将列表随机组合在一起?
或者我给每个节点一个随机数,然后根据随机数在节点上进行合并?
是否存在并发可变优先级队列?理想情况下,我正在寻找一个C++实现,但是,对于初学者来说,指向算法的指针会非常有用.
要清楚,我正在寻找一个优先级队列,我可以调整元素的优先级.特别是,TBB concurrent_priority_queue不提供必要的功能.(就此而言,priority_queue即使我们忽略并发性,STL也不会.)Boost.Heap库提供了我想要的串行功能,但没有并发性.当然,我正在寻找比在每次操作中锁定整个队列更细粒度的东西.
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 上执行的共享对象(动态库)。
我有两个问题:
arc,argv?我想在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) 我有一个使用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解释器?
我想在一组块上并行执行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()?
以下代码不起作用.它的目的是将参数传递给可变参数基类.这是可能的,如果是这样,实施它的正确方法是什么?(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) 我可以用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) 关于检查成员函数是否存在,有许多已回答的问题:例如, 是否可以编写模板来检查函数是否存在?
但是,如果函数重载,此方法将失败.这是一个稍微修改过的代码,来自该问题的最高评价答案.
#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)