我有一个我想要迭代的元素图.当然,标准的方法是使用for循环
for (map<string, int> iterator it = myMap.begin(); it != myMap.end(); ++it) {
string thisKey = it->first;
int thisValue = it->second;
}
Run Code Online (Sandbox Code Playgroud)
但是如果我尝试使用OpenMP的并行构造使这个循环并行运行,它就不起作用,这显然是一个已知的问题,因为它不能识别这种循环结构.
所以,我的备份计划是使用整数索引迭代器,并按索引访问键和值列表,就像我在C#中所做的那样:
for (int i = 0; i < myMap.Count; ++i) {
string thisKey = myMap.Keys[i];
string thisValue = myMap.Values[i];
}
Run Code Online (Sandbox Code Playgroud)
...但我似乎无法在C++中找到一个等效的方法.有没有办法在C++中做到这一点,我不知道?
作为我的项目的一部分,我有一个二进制数据文件,由一系列32位整数组成,我的一个类在初始化时读入.在我的C++库中,我使用以下初始化程序读取它:
Evaluator::Evaluator() {
m_HandNumbers.resize(32487834);
ifstream inputReader;
inputReader.open("/path/to/file/7CHands.dat", ios::binary);
int inputValue;
for (int x = 0; x < 32487834; ++x) {
inputReader.read((char *) &inputValue, sizeof (inputValue));
m_HandNumbers[x] = inputValue;
}
inputReader.close();
};
Run Code Online (Sandbox Code Playgroud)
在移植到Swift时,我决定将整个文件读入一个缓冲区(它只有大约130 MB),然后将这些字节从缓冲区中复制出来.
所以,我做了以下事情:
public init() {
var inputStream = NSInputStream(fileAtPath: "/path/to/file/7CHands.dat")!
var inputBuffer = [UInt8](count: 32478734 * 4, repeatedValue: 0)
inputStream.open()
inputStream.read(&inputBuffer, maxLength: inputBuffer.count)
inputStream.close()
}
Run Code Online (Sandbox Code Playgroud)
它工作得很好,因为当我调试它时,我可以看到inputBuffer包含我的十六进制编辑器应该说的相同的字节数组.现在,我想有效地从那里获取数据.我知道它存储在......你称之为最低有效字节的第一个格式(即数字0x00011D4A在文件中表示为'4A1D 0100').我很想手动迭代它并手动计算字节值,但我想知道是否有一种快速方法可以传递[Int32]数组并让它读取这些字节.我尝试使用NSData,例如:
let data = NSData(bytes: handNumbers, length: handNumbers.count * sizeof(Int32))
data.getBytes(&inputBuffer, length: inputBuffer.count)
Run Code Online (Sandbox Code Playgroud)
但似乎没有加载值(所有值仍为零).有人可以帮我把这个字节数组转换成一些Int32值吗?更好的是将它们转换为Int(即64位整数)只是为了在整个项目中保持我的变量大小相同.
在Sierra下测试我的代码时,我发现先前处理并发队列的方法不再有效.
在我的C++代码库分析错误,用户的一个建议,涉及明确指定的目标队列声明(看到这个帖子:一个解决办法C++ 11的应用程序,它使用dispatch_apply没有在Mac OS塞拉利昂工作),似乎有解决了这个问题.
在Swift 3中,下面的代码将用于同时执行一个闭包,但它在上面的文章中展示了类似的C++示例:
import Foundation
import GameKit
DispatchQueue.concurrentPerform(iterations: 1000) { index in
let pauseTime = GKRandomSource.sharedRandom().nextInt(upperBound: 5)
sleep(UInt32(pauseTime))
print(index)
}
Run Code Online (Sandbox Code Playgroud)
...但是,当我执行它时,它会串行运行每个块,索引按数字顺序输出.
任何人都知道如何利用该帖子中推荐的解决方法来解决我在Swift中的"并发"调度问题?
在我的一个课程中,我有一个例程来读取和写入 Decimal 类型的数组(使用BinaryReader/BinaryWriter和方法,即:ReadDecimal()Write()
BinaryReader inputReader = new BinaryReader(File.OpenRead(BaseFilePath));
for (int x = 0; x < 6; x++) {
for (int y = 0; y < m_Codes[x].GetLength(0); y++) {
for (int z = 0; z < m_Codes[x].GetLength(1); z++) {
m_Codes[x][y, z] = inputReader.ReadDecimal();
}
}
}
Run Code Online (Sandbox Code Playgroud)
和
for (int x = 0; x < 6; x++) {
for (int y = 0; y < m_Codes[x].GetLength(0); y++) {
for (int z = 0; z < m_Codes[x].GetLength(1); …Run Code Online (Sandbox Code Playgroud) 我正在将一些代码从C++移植到使用Grand Central Dispatch的Swift,我发现一个奇怪的错误,dispatch_queue_create看起来根本不起作用.
例如,在我的C++基类头中,我会声明
dispatch_queue_t m_WorkQ;
Run Code Online (Sandbox Code Playgroud)
并在初始化器中,放
m_ResultQ = dispatch_queue_create("com.myapp.mHitsUpdateQueue", 0);
Run Code Online (Sandbox Code Playgroud)
......一切都很光荣.
我在Swift中尝试过这个,在我的课堂上,在课堂上声明这个:
var resultQueue: dispatch_queue_t
Run Code Online (Sandbox Code Playgroud)
......在初始化者中,我有(除其他外)这条线
resultQueue = dispatch_queue_create("com.myapp.mHitsUpdateQueue", 0)
Run Code Online (Sandbox Code Playgroud)
...它编译并启动正常,但在上面的行上给我一个EXC_BAD_ACCESS(代码= 1,地址= 0x37)的立即运行时错误
为了确定它是否是我做过的任何其他事情,我创建了一个仅包含以下代码的命令行工具应用程序:
import Foundation
var thisQueue = dispatch_queue_create("com.myApp.mHitsUpdateQueue", 0)
println(thisQueue.description)
Run Code Online (Sandbox Code Playgroud)
......果然,我在"thisQueue"分配线上得到了上述错误.所以我非常确定有一些关于Swift和GCD队列创建非常明显的东西,我很遗憾.
有人可以帮帮我吗?
我有兴趣采用新的Swift编程语言.我维护的代码库通过C++ Grand Central Dispatch扩展(dispatch_async等)广泛使用多核处理.
有没有评论过Swift的人知道这种语言能否以类似的方式访问GCD?
swift ×4
c++ ×2
biginteger ×1
binary ×1
c# ×1
dictionary ×1
file ×1
io ×1
iterator ×1
macos-sierra ×1
openmp ×1
port ×1
queue ×1
stdmap ×1