我在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的分裂最大还是有办法更快地完成它?
我刚刚为地图中的字符串创建了自定义查找功能.我开发了某种线性搜索算法(我后来发现)并且不满意函数的速度.所以我搜索了一个更快的函数,找到了map自己的函数:map :: find.
这比我使用的线性算法快得多.
在另一个例子中,STL的函数find比我正在使用的另一个线性函数快得多.
但这怎么可能呢?如果您使用二进制搜索算法,则需要首先对地图进行排序,这会使(地图)更长的时间对地图进行排序.
另外如何找出这些核心功能背后的算法?是否有列表或某种数据库可以找到它?
谢谢你的所有答案!我提出了最佳答案并接受了Max Lybbert的答案,因为它是最详细的答案.
保罗:)
我正在尝试使用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)
我完全不知道如何解决这个问题,我甚至不知道为什么会这样.
谢谢大家的帮助,
保罗
我刚刚发现了AWS Glacier服务,并希望编写一个小型 Python应用程序来通过REST API上传文件.我看了看所需的标题,偶然发现了x-amz-sha256-tree-hash.我需要计算整个文件的SHA-256哈希值以及每个1 MB块的所有哈希值的父哈希值.这导致以下树:

(图片来自这里)
我已经创建了一个读取1 MB块的函数和一个即时计算其哈希值的类,但后来我完全挣扎:
在我的应用程序中,我创建了一个类chunk,它接受数据并计算__init__方法中的哈希值,并保存父项和子项(如常规树).当用户打开文件时,将使用各自的哈希值(在此示例中为7个块实例)正确生成这些块实例.
现在我有两个相互联系的大问题:
我在SO上查看了这个主题但是这个方法只适用于偶数儿童计数,但并不总是这样.
你能帮我找到解决这个问题的方法/算法/方法吗?
提前致谢!
保罗
我正在为更大的软件开发一个小型服务器循环,但它不能像我希望的那样工作.
当用户键入".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)
它不会每次都发生,但经常发生,我想解决这个问题而不是忽略它.
你能帮助我如何关闭这个倒干净?
NSOutlineView在我的项目中,我有一个完美的基于视图的功能,并具有正确的设置数据源.现在我想允许用户更改某些条目.所以我NSTextField在IB中编辑了可编辑的内容.对于基于单元格的方法,NSOutlineView您可以使用委托方法,outlineView:setObjectValue:forTableColumn:byItem:但它不适用于基于视图NSOutlineView的NSOutlineViewData协议的头文件中所述:
/*基于视图的OutlineView:此方法不适用.*/
(void)outlineView:(NSOutlineView*)outlineView setObjectValue:(id)object forTableColumn:(NSTableColumn*)tableColumn byItem:(id)item;
所以我搜索了另一个委托方法并找到了outlineView:shouldEditTableColumn:item:.但是这个委托方法不会被触发.可能是因为我没有编辑一个单元格.
所以我的问题是:当一行更改时,是否有任何其他方法可以注意到每个方法的代理NSTextField?
c++ ×3
algorithm ×2
objective-c ×2
boost ×1
boost-asio ×1
boost-thread ×1
delegates ×1
find ×1
hash ×1
hashtree ×1
hmac ×1
performance ×1
php ×1
python ×1
sha1 ×1
split ×1
stl ×1
string ×1