我想使用SSE内在函数翻译此代码.我找到了可能与此代码一起使用的pshufbSSSE3指令和类似的__builtin_ia32_pshufb128(v128i, v128i)GCC内在函数.代码s通过索引k通过特定方式交换数组中的字节来置换字节向量.
void permutation(int k, std::vector<char> & s)
{
for(size_t j = 1; j < s.size(); ++j)
{
std::swap(s[k % (j + 1)], s[j]);
k = k / (j + 1);
}
}
Run Code Online (Sandbox Code Playgroud)
我花了一个小时思考如何将代码翻译成pshufb.是否有可能用单个信号置换16个字节,pshufb还是需要多个指令?足够好的解决方案将在时间上只置换16个字节.
编辑:问题的进一步背景:我正在迭代所有可能的排列s.提前计算k = 0, 1, 2,...多个结果s是可以的.但是我需要k稍后再现-th置换,最好是O(1)操作.
所以我有这样的文件(或值)列表
set(HEADER_FILES DirA/header1.h DirA/header2.hpp
DirB/header3.h DirB/stuff.hpp)
Run Code Online (Sandbox Code Playgroud)
那么如何才能在DirA中获取文件的子列表?我正在使用CMake 2.8.x并且我累了正则表达式匹配:
string(REGEX MATCHALL "DirA/(.+)" DirA_FILES ${HEADER_FILES})
Run Code Online (Sandbox Code Playgroud)
但结果只是原始字符串的副本,如:"DirA/header1.h DirA/header2.hpp DirB/header3.h DirB/stuff.hpp"或什么都没有.
再好一点,在写这个问题时我解决了它:
set(SubListMatch)
foreach(ITR ${HEADER_FILES})
if(ITR MATCHES "(.*)DirA/(.*)")
list(APPEND SubListMatch ${ITR})
endif()
endforeach()
Run Code Online (Sandbox Code Playgroud)
但是CMake对我来说是一件很新鲜的事情,那么如何将该代码包装成函数呢?到目前为止,我从未编写任何CMake函数.
我有以下情况:在标头“test.hpp”中我定义:
class ObjectA {
public:
ObjectA();
~ObjectA();
static ObjectA & get_A();
};
class ObjectB {
public:
~ObjectB();
static ObjectB & get_B();
void do_cleanup();
};
Run Code Online (Sandbox Code Playgroud)
在单独的编译单元中,我实现了 ObjectB:
#include "test.hpp"
#include <iostream>
ObjectB::~ObjectB() {
std::cout<<"ObjectB dtor"<<std::endl;
}
ObjectB & ObjectB::get_B() {
thread_local ObjectB b_instance;
return b_instance;
}
void ObjectB::do_cleanup() {
std::cout<<"Clearing up B garbage..."<<std::endl;
}
Run Code Online (Sandbox Code Playgroud)
对象A:
#include "test.hpp"
#include <iostream>
ObjectA::ObjectA() {
ObjectB::get_B(); <--dummy call to initialize thread_local ObjectB;
}
ObjectA::~ObjectA() {
std::cout<<"ObjectA dtor"<<std::endl;
ObjectB::get_B().do_cleanup(); // <-- is this undefined behaviour??
} …Run Code Online (Sandbox Code Playgroud) 如何找到第一个不存在的值h,使结果被限制在范围内.std::set<int> ids[0, *ids.rbegin() + 1]
我认为这是一个相当简单的问题,但我还没有找到任何匹配的问题.基本上我想要倒置的一套,ids以便我可以使用它们.
到目前为止我有以下内容:
#incldue <set>
std::set<int> ids;
int h = 0;
for(; !ids.empty() && (h <= *ids.rbegin() + 1); ++h) {
if(!ids.count(h)) {
break;
}
}
// h is now smallest value not in ids.
Run Code Online (Sandbox Code Playgroud)
我怀疑这会进一步改进,例如不需要循环?
@edit:澄清集合中的值:在我的用例中,算法生成的值被插入到集合中.我应该说的真的std::set<unsigned int>.我很高兴在这个问题上进行了如此多的讨论!