小编Pau*_*aul的帖子

使用多个分隔符进行快速字符串拆分

我在StackOverflow上调查了一段时间,找到了很好的算法来将带有多个分隔符的字符串拆分成一个vector< string >.我还发现了一些方法:

推动方式:

boost::split(vector, string, boost::is_any_of(" \t"));
Run Code Online (Sandbox Code Playgroud)

getline方法:

std::stringstream ss(string);
std::string item;
while(std::getline(ss, item, ' ')) {
    vector.push_back(item);
}
Run Code Online (Sandbox Code Playgroud)

Boost的标记化方式:

char_separator<char> sep(" \t");
tokenizer<char_separator<char>> tokens(string, sep);
BOOST_FOREACH(string t, tokens)
{
   vector.push_back(t);
}
Run Code Online (Sandbox Code Playgroud)

和酷STL方式:

     istringstream iss(string);
     copy(istream_iterator<string>(iss),
     istream_iterator<string>(),
     back_inserter<vector<string> >(vector));
Run Code Online (Sandbox Code Playgroud)

和Shadow2531的方法(参见链接主题).

他们中的大多数来自这个主题.但不幸的是他们没有解决我的问题:

  • Boost的分裂很容易使用,但是大数据(在最好的情况下大约1.5*10 ^ 6单个元素)和大约10个分隔符我使用它的可怕的慢.

  • getline,STL和Shadow2531的方法有,我只能用一个单个字符作为分隔符的问题.我需要更多.

  • 在速度方面,Boost的标记化更加可怕.用10个分隔符花了11秒钟将一个字符串分成1.5*10 ^ 6个元素.

所以我不知道该怎么做:我希望有一个非常快速的字符串拆分算法和多个分隔符.

Boost的分裂最大还是有办法更快地完成它?

c++ string performance boost split

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

STL的发现背后有什么算法?

我刚刚为地图中的字符串创建了自定义查找功能.我开发了某种线性搜索算法(我后来发现)并且不满意函数的速度.所以我搜索了一个更快的函数,找到了map自己的函数:map :: find.

这比我使用的线性算法快得多.

在另一个例子中,STL的函数find比我正在使用的另一个线性函数快得多.

但这怎么可能呢?如果您使用二进制搜索算法,则需要首先对地图进行排序,这会使(地图)更长的时间对地图进行排序.

另外如何找出这些核心功能背后的算法?是否有列表或某种数据库可以找到它?

谢谢你的所有答案!我提出了最佳答案并接受了Max Lybbert的答案,因为它是最详细的答案.

保罗:)

c++ algorithm stl find

9
推荐指数
2
解决办法
8107
查看次数

如何让PHP创建像Objective-C这样的HMAC-SHA1字符串?

我正在尝试使用PHP和Objective-C实现身份验证解决方案.两种语言都使用相同的密钥和相同的密钥创建自己的HMAC-SHA1编码字符串.

显然他们似乎在如何做到这一点上有所不同.

在Objective-C方面,我使用OAuthCustomer作为签名类,它产生正确的编码字符串:

/3n/d4sKN6k3I7nBm1qau59UukU=
Run Code Online (Sandbox Code Playgroud)

在PHP方面,我使用内置函数hash_hmac('sha1',...)和base64编码,它产生:

ZmY3OWZmNzc4YjBhMzdhOTM3MjNiOWMxOWI1YTlhYmI5ZjU0YmE0NQ==
Run Code Online (Sandbox Code Playgroud)

然后我尝试使用另一个函数(这里提到),这产生了base64编码:

NWY1ODUwOWE3NGI4NWU5ZTIxMDYzMTNmNzk3NTYxMDQ4OWE1MmUzNQ==
Run Code Online (Sandbox Code Playgroud)

我完全不知道如何解决这个问题,我甚至不知道为什么会这样.

谢谢大家的帮助,

保罗

php sha1 objective-c hmac

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

反向树建筑(有奇数个孩子)

我刚刚发现了AWS Glacier服务,并希望编写一个小型 Python应用程序来通过REST API上传文件.我看了看所需的标题,偶然发现了x-amz-sha256-tree-hash.我需要计算整个文件的SHA-256哈希值以及每个1 MB块的所有哈希值的父哈希值.这导致以下树:

AWS的SHA-256 Tree Hash过程

(图片来自这里)

我已经创建了一个读取1 MB块的函数和一个即时计算其哈希值的类,但后来我完全挣扎:

在我的应用程序中,我创建了一个类chunk,它接受数据并计算__init__方法中的哈希值,并保存父项和子项(如常规树).当用户打开文件时,将使用各自的哈希值(在此示例中为7个块实例)正确生成这些块实例.

现在我有两个相互联系的大问题:

  1. 如何反向构建这棵树?我基本上需要为最低层上的每两个块实例创建一个新块,并根据这两个哈希值计算哈希值.但是我在哪里存储那个父母?在父母的孩子和反向树行走?
  2. 如何与奇数个孩子一起工作?如果我有一个遍历每个父层的算法,那么我会错过最后一个(0.5 MB)块.

我在SO上查看了这个主题但是这个方法只适用于偶数儿童计数,但并不总是这样.

你能帮我找到解决这个问题的方法/算法/方法吗?

提前致谢!

保罗

python algorithm hash amazon-web-services hashtree

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

使用Boost :: Asio停止线程服务器循环

我正在为更大的软件开发一个小型服务器循环,但它不能像我希望的那样工作.

当用户键入".quit"时,我希望软件停止此线程服务器循环:

try {

while (true) {
      acceptor.accept(socket);
      const size_t buffersize = 1024;
      char data[buffersize+1] = {0};
      data[socket.read_some(boost::asio::buffer(data,buffersize))] = '\0'; // Write data & place terminator
      boost::thread asyncWriting(boost::bind( &myClass::writeToFile, this ));
      socket.close();
}

} catch(const boost::system::system_error& e) {
    cout << "Boost System Error: " << e.what() << endl;
}
Run Code Online (Sandbox Code Playgroud)

我按以下方式启动线程:

serverThread = boost::shared_ptr<boost::thread>( new boost::thread(boost::bind( &myClass::startServer, this )) );
Run Code Online (Sandbox Code Playgroud)

但是我在停止"服务器"时遇到了问题.无论我是否中断线程,关闭套接字和/或接受器,或者只是破坏程序Boost会抛出错误:

 Bad file descriptor
Run Code Online (Sandbox Code Playgroud)

它不会每次都发生,但经常发生,我想解决这个问题而不是忽略它.

你能帮助我如何关闭这个倒干净

c++ boost-thread boost-asio

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

在基于视图的NSOutlineView中为NSTextField委派事件?

NSOutlineView在我的项目中,我有一个完美的基于视图的功能,并具有正确的设置数据源.现在我想允许用户更改某些条目.所以我NSTextField在IB中编辑了可编辑的内容.对于基于单元格的方法,NSOutlineView您可以使用委托方法,outlineView:setObjectValue:forTableColumn:byItem:但它不适用于基于视图NSOutlineViewNSOutlineViewData协议的头文件中所述:

/*基于视图的OutlineView:此方法不适用.*/

(void)outlineView:(NSOutlineView*)outlineView setObjectValue:(id)object forTableColumn:(NSTableColumn*)tableColumn byItem:(id)item;

所以我搜索了另一个委托方法并找到了outlineView:shouldEditTableColumn:item:.但是这个委托方法不会被触发.可能是因为我没有编辑一个单元格.

所以我的问题是:当一行更改时,是否有任何其他方法可以注意到每个方法的代理NSTextField

delegates objective-c nsoutlineview

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