我试图以一种std::vector<std::unique_ptr<std::string>>
与Bjarne Stroustrup的C++ 11 FAQ相同的方式初始化一个:
using namespace std;
vector<unique_ptr<string>> vs { new string{"Doug"}, new string{"Adams"} }; // fails
unique_ptr<string> ps { new string{"42"} }; // OK
Run Code Online (Sandbox Code Playgroud)
我看不出这个语法失败的原因.这种初始化容器的方式有问题吗?
编译器错误消息很大; 我找到的相关部分如下:
/usr/lib/gcc-snapshot/lib/gcc/i686-linux-gnu/4.7.0/../../../../include/c++/4.7.0 /bits/stl_construct.h:77 :7:错误:没有匹配的调用函数
'std::unique_ptr<std::basic_string<char> >::unique_ptr(std::basic_string<char>&)'
修复此错误的方法是什么?
据我所知,任何地方都std::back_inserter
可以在STL算法中运行,你可以传递一个std::inserter
构造.end()
而不是:
std::copy(l.begin(), l.end(), std::back_inserter(dest_list));
std::copy(l.begin(), l.end(), std::inserter(dest_list, dest_list.end()));
Run Code Online (Sandbox Code Playgroud)
并且,不像back_inserter
,据我所知,inserter
可以为任何STL容器工作!我试了一下成功为std::vector
,std::list
,std::map
,std::unordered_map
来这里之前感到惊讶.
我想也许是因为push_back
某些结构的速度可能更快insert(.end())
,但我不确定......
对于std::list
(有道理)似乎并非如此:
// Copying 10,000,000 element-list with std::copy. Did it twice w/ switched order just in case that matters.
Profiling complete (884.666 millis total run-time): inserter(.end())
Profiling complete (643.798 millis total run-time): back_inserter
Profiling complete (644.060 millis total run-time): back_inserter
Profiling complete (623.151 millis total run-time): inserter(.end()) …
Run Code Online (Sandbox Code Playgroud) 基于在回答这些 问题 在这里,我知道这肯定是最好使用C++ 14的std::make_unique
,而不是emplace_back(new X)
直接.
那就是说,打电话是首选
my_vector.push_back(std::make_unique<Foo>("constructor", "args"));
Run Code Online (Sandbox Code Playgroud)
要么
my_vector.emplace_back(std::make_unique<Foo>("constructor", "args"));
Run Code Online (Sandbox Code Playgroud)
也就是说,我应该使用push_back
或emplace_back
何时添加std::unique_ptr
构造的std::make_unique
?
====编辑====
为什么?c:< - (微笑)
是否有便捷/简便的方法来遍历数组上的for循环,同时获取值和索引?
基本选项:
i = 1
for file in ["foo.csv", "bar.csv"]
...
i += 1
end
Run Code Online (Sandbox Code Playgroud)
files = ["foo.csv", "bar.csv"]
for i in 1:length(files)
files[i]
end
Run Code Online (Sandbox Code Playgroud) 当用户点击任何html网页上的分享按钮时,我正在尝试注册我的应用程序以显示在Safari的"Open-in ..."对话框中.
我已经在Xcode中的文档类型中添加了public.html
(并且public.data
有很好的衡量标准)内容类型,如许多答案所示:(请参阅此问题,此问题或此Apple文档.)
而且,它似乎工作.如果我在Safari中打开.pdf,我会在顶部显示"在我的应用程序中打开"对话框.我还可以使用其他应用程序中的"open in ..."对话框与My App共享文档.
为了测试它,我按照这个答案中的建议构建了DocInteraction,如果我创建了一个html文件,我的应用程序将显示在共享对话框中.
但是,我的应用程序仍未显示在Safari的共享对话框中.当我在iOS模拟器上的iOS7中运行它时,我只会看到Mail,Twitter和Facebook:
当我在真正的iOS设备上测试它时也是如此:
但是,我希望你注意到它似乎有可能!看看上面的截图..很多,微博已经完成了这个壮举.我不知道怎么样,但由于某种原因微博出现在这个列表中,即使我的应用程序没有.
而且你知道,实际上,考虑到有多少应用程序可以打开html页面,这种情况很有意义.这是在我的iOS设备上运行的DocInteraction,试图共享一个html页面:
它就是!我的应用!(它实际上被称为"Wulu Podify").但是有很多应用程序渴望.html页面,我想Safari认为提供它们可能有点压倒性.
但是,这仍然引出了一个问题,微博是如何进入这个名单的呢?但是,一些进一步的挖掘似乎表明,实际上微博似乎已经在每一个列表上.
我不确定他们是如何管理它的,但也许他们会以不同的方式解决这个问题.
微博的"I-will-open-any-document-you-to-me-c'mon-try-it-c'mon"方法可以解决这个问题,但这并不理想.我真的只想打开html页面.
所以.我猜我的问题有三个方面:
谢谢你的帮助!我已经有一段时间了!
更新:
所以,实际上,我没有意识到这一点,但我认为微博可能是一个像Facebook和Twitter一样的内置选项.我以为它就在那里,因为我把它安装在我的手机上,但也许它是iOS6的默认设置之一.我这样说是因为当我在iOS6.0模拟器上测试时,我突然看到微博出现在共享屏幕上,即使我绝对没有在我的模拟器上安装它.
所以也许没有办法解决这个问题,除非它通过苹果内置到Safari中.
include
您项目的所有文件的推荐方法是什么?
我已经看到许多使用类似结构的示例:include
单个顶级文件中的有序语句列表(定义Module
应用程序中的"主"文件的文件).
这也似乎是在以下螺纹的结论: https://discourse.julialang.org/t/best-practices-for-structuring-larger-projects/2652?u=nhdaly
然而,Lint.jl
似乎对这种项目结构非常不满,抱怨持久性的use of undeclared symbol
s.
请考虑以下示例:
# --- src/lib1.jl ---
struct MyStruct
x::Int32
end
# --- src/lib2.jl ---
foo() = MyStruct(3) # Lint.jl says: E321 MyStruct: use of undeclared symbol
# --- src/MyPackage.jl ---
module MyPackage
include("lib1.jl")
include("lib2.jl")
foo()
end
Run Code Online (Sandbox Code Playgroud)
当然,这段代码可以正常工作,因为MyStruct
在lib2.jl
编译之前可以使用.但Lint.jl
无法知道.即使使用Atom集成linter
,它也会显示相同的错误.
那么最好是lib2.jl include("lib1.jl")
而不是top文件中的所有包含吗?或者最好将它们放在两个地方,就像C++
标题一样?我没有在任何地方看到这方面的明确建议,如果有人可以提供,我会很高兴!:)
编辑:更改文件名以反映更典型的julia目录结构.
我一直试图在JPDA的上下文中将两个客户端调试器连接到Debuggee程序失败.这是可能的还是有解决方法来实现它?
我使用eclipse作为IDE(编辑拼写错误).将服务器程序视为打开的Hello World:
System.out.println("I have the String"); //1
System.out.println("You will have to pass through the breakpoints before you shall see");
System.out.println("breakpoints");
System.out.println("before you shall see"); //4
Run Code Online (Sandbox Code Playgroud)
我们可以在第1和第4行放置断点.
第1步:在运行配置中传递给程序的参数:
-Xdebug -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=y
Run Code Online (Sandbox Code Playgroud)
(server=y
告诉vm表现得像服务器一样,suspend=y
暗示prog执行将暂停,直到调试器锁定到它)并运行程序.
第2步:转到Debug as , Debug config ,Remote Java application
并创建一个新实例:
Project: Same as before
Connection type: Socket Attach(Socket Attach)
Host:LocalHost
Port:8000
Run Code Online (Sandbox Code Playgroud)
现在,当我调试Prog执行时,在指定的断点处停止.我无法做的是创建这个远程调试器的另一个实例,它可以锁定到服务器(prog 1),当我这样做时,我得到一个拒绝连接.如果有其他人遇到此问题并且是否存在解决方法,请告诉我.谢谢!
谢谢
在OSX Yosemite(.mm
10.10.5 )上更新到Xcode 7后,我的XCTest文件现在无法编译.我收到以下错误:
In file included from /Users/.../unit_test.mm:9:
In file included from /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/Library/Frameworks/XCTest.framework/Headers/XCTest.h:32:
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/System/Library/Frameworks/Security.framework/Headers/SecItem.h:985:49: error: expected ';' after top level declarator
extern const CFStringRef kSecUseAuthenticationUI
^
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/System/Library/Frameworks/Security.framework/Headers/SecItem.h:987:54: error: expected ';' after top level declarator
extern const CFStringRef kSecUseAuthenticationContext
^
...
Run Code Online (Sandbox Code Playgroud)
它抱怨所有的行看起来像这样:
extern const CFStringRef kSecUseAuthenticationUI
__OSX_AVAILABLE_STARTING(__MAC_10_11, __IPHONE_9_0);
extern const CFStringRef kSecUseAuthenticationContext
__OSX_AVAILABLE_STARTING(__MAC_10_11, __IPHONE_9_0);
Run Code Online (Sandbox Code Playgroud)
虽然这些声明没有问题:
extern const CFStringRef kSecUseItemList
__OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_2_0);
Run Code Online (Sandbox Code Playgroud)
看起来更新添加了在OS 10.10上不再使用XCTest编译的__MAC_10_11
行和.mm
文件.
有没有人知道除了升级到OS 10.11之外的解决方法?
谢谢.
如果我有一个构建元组的递归函数,它在每个函数中通过在元组中附加/添加一个元素来创建一个新元组,是将它朝前还是朝后生长更好?有关系吗?即使它们最终执行相同,它们中的一个在编译器上是否更容易?
以这个愚蠢的函数为例,想象一下我不在乎数字是升序还是降序(因为我总是可以调整调用代码以两种方式工作):
julia> function tuple_one_through_n(n, t=())::Tuple
if n === 0
t
else
tuple_one_through_n(n-1, (n, t...))
end
end
tuple_one_through_n (generic function with 2 methods)
julia> tuple_one_through_n(5)
(1, 2, 3, 4, 5)
Run Code Online (Sandbox Code Playgroud)
有什么理由更喜欢t
在之前n
或之后喷溅吗?谢谢!
编辑:对于更多上下文:我们添加这样的元组是因为我们实际上将它用作不可变的函数跟踪,并且通过附加创建新元组是线程安全的,因此即使我们生成新任务它也能工作:每个任务都会然后让它自己的堆栈跟踪增长,跟踪所有调用者。
我认为更好的选择可能是PersistentVector
来自https://github.com/JuliaCollections/FunctionalCollections.jl/blob/master/README.md的不可变内容,但对于最简单的第一遍,我只是使用元组,而我是想知道是否有任何理由更喜欢一种或另一种订单。:) 因为有些人可能有一个增长元组的有效用例,我想我会问。