我知道为了从命令行获取xcode安装目录,我必须使用xcode-select -print-path.结果如下:/Applications/Xcode.app/Contents/Developer
是否有任何命令来获取最新的SDK文件夹?我需要结果如下:/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.8.sdk/
如果无法获得SDK完整路径,我至少需要SDK编号,我将尝试构建路径.
std::list迭代器有一些非常好的属性 - 当删除任何其他元素,添加新元素时,甚至当交换2个列表时,它们仍然有效(迭代器失效规则)!
考虑以下代码行为并且迭代器是通过指向实际节点的指针的形式实现的,当移动列表时,该指针不会改变,我猜测迭代器在std::list移动a时在新容器中仍然有效,而且我可以通过访问实际具有"预期"值的无效内存进入UB区域.
std::list<int> l1{3, 2, 1};
std::list<int> l2;
auto it = std::prev(l1.end());
std::cout<<l1.size()<<" "<<l2.size()<<" "<<*it<<std::endl;
l2 = std::move(l1);
std::cout<<l2.size()<<" "<<*it<<std::endl;
3 0 1
3 1
Run Code Online (Sandbox Code Playgroud)
如果std::list移动时迭代器保持有效,它是否由标准保证?其他容器怎么样?
我有以下代码:
std::unordered_map<std::string, std::string> map;
map["k1"] = "v1";
auto& v1 = map["k1"];
map["k2"] = "v2";
Run Code Online (Sandbox Code Playgroud)
阅读http://en.cppreference.com/w/cpp/container/unordered_map后
笔记
交换函数不会使容器内的任何迭代器无效,但它们会使标记交换区域末尾的迭代器无效.
存储在容器中的键或数据的引用和指针只有通过擦除该元素才会失效,即使相应的迭代器无效也是如此.
v1即使在插入过程中可能发生重新散列,看起来在插入新值后也可以安全使用.
我对这句话的解释是否正确?我可以在修改地图后使用地图中值的引用/指针(显然擦除值本身会使引用/指针无效)?
迭代器擦除(迭代器位置);
迭代器擦除(迭代器优先,迭代器最后);
擦除元素从向量容器中移除单个元素(位置)或一系列元素([first,last)).
这有效地减少了矢量大小,删除了元素的数量,之前调用每个元素的析构函数.
和:
去掉
从[first,last]定义的范围中移除所有等于给定值的元素.通过移动范围中的元素以便覆盖所需元素来完成移除.范围的旧端和新端之间的元素保持不变.返回到范围的新结尾的迭代器.
有没有办法从迭代器范围内的std :: vector中删除元素(类似于remove,但是[first,last]中的所有元素)而不调整向量的大小?我需要保持它在运行时达到的最大大小以防止重新分配.
谢谢!
我SaveFileDialog用来选择我想要保存文件的路径.我设置InitialDirectory为某个文件夹,但我想将保存位置限制为该文件夹或该文件夹的子文件夹.这可能吗?
SaveFileDialog dialog = new SaveFileDialog();
dialog.InitialDirectory = "SomePath"//this is the path that I want to be root folder
Run Code Online (Sandbox Code Playgroud) 我知道全局变量是按相同编译单元的声明顺序创建的,并且未在多个编译单元之间定义创建顺序.
我前段时间读过,全局变量是在调用定义它们的编译单元中的任何代码之前创建的.这是由标准定义的吗?
例:
file1.cpp
int f1v1 = f1_1();
int f1v2 = f1_2();
void f1(){...}
int f1_1(){...}
int f1_2(){...}
Run Code Online (Sandbox Code Playgroud)
file2.cpp
static int f2v1 = f2_1();
static int f2v2 = f2_2();
int f2_1(){...}
int f2_2(){...}
Run Code Online (Sandbox Code Playgroud)
main.cpp中
#include "file1.h"
#include "file2.h"
int main()
{
f1();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,f1_1()是否由之前f1_2()和之前调用的标准保证f1()?由标准,保证f2_1()和f2_2()被称为可言,因为没有在file2.cpp定义的函数被调用,f2v1并且f2v2是不可见的外file2.cpp?
编辑:
当在lib1中编译file1.cpp并且在lib2中编译file2.cpp时,标准是否指定了行为?
我有这个简单的代码:
#include <vector>
class A
{
private:
struct B{int x;};
public:
std::vector<B> v;
};
int main()
{
A a;
for (std::vector<A::B>::iterator it = a.v.begin(); it != a.v.end(); ++it)
{
it->x = 0;
}
for (auto it = a.v.begin(); it != a.v.end(); ++it)
{
it->x = 0;
}
}
Run Code Online (Sandbox Code Playgroud)
正如预期的那样,我在第一个for循环中构建了错误--A :: B是私有的,但是第二个for循环在Visual Studio 2010,2012和2013中编译得很好.这是正常行为还是编译器中的错误?
当我尝试启动应用程序时,我在标题中写了错误.我用谷歌搜索,但没有找到任何带有'LocalDebuggerWorkingDirectory'关键字的页面.该解决方案包含c#和c ++项目的混合,它工作正常,直到今天...我使用Windows 7和Visual Studio 2010.你知道我在哪里可以找到这个属性来改变它或我如何添加它?
是否有可能检查lua脚本是否包含错误而不执行它?我有以下代码:
if(luaL_loadbuffer(L, data, size, name))
{
fprintf (stderr, "%s", lua_tostring (L, -1));
lua_pop (L, 1);
}
if(lua_pcall(L, 0, 0, 0))
{
fprintf (stderr, "%s", lua_tostring (L, -1));
lua_pop (L, 1);
}Run Code Online (Sandbox Code Playgroud)
但是如果脚本包含错误,则它会先执行,然后执行.我想知道它在加载时是否包含错误,而不是在我执行它时.这可能吗?
我有一个动画类.我需要有一些观察员Play,Pause并Stop在动画的事件.我找到了2个解决这个问题的方法,但我不知道该选择什么.
使用boost :: signals或类似的东西,并为每个事件注册回调
使用3个纯虚函数(OnPlay(),)创建一个简单的接口OnPause(),OnStop()并传递给实现此接口的Animation类对象.
每种方法都有优点和缺点.我将尝试列举到目前为止我发现的那些:
优点1.
缺点1.
优点2.
2的缺点.
你能告诉我用什么吗?根据您的经验,对于这个问题有什么好处 - 从第一个方面获得免费或从第二个方面清晰易懂的代码?您能否告诉我这两种方法或其他解决方案的其他优点/缺点?