close()我使用时需要手动拨打电话std::ifstream吗?
例如,在代码中:
std::string readContentsOfFile(std::string fileName) {
std::ifstream file(fileName.c_str());
if (file.good()) {
std::stringstream buffer;
buffer << file.rdbuf();
file.close();
return buffer.str();
}
throw std::runtime_exception("file not found");
}
Run Code Online (Sandbox Code Playgroud)
我需要file.close()手动拨打电话吗?不应该ifstream使用RAII来关闭文件?
我正在使用杰克逊图书馆.
我想在序列化/反序列化时忽略特定字段,例如:
public static class Foo {
public String foo = "a";
public String bar = "b";
@JsonIgnore
public String foobar = "c";
}
Run Code Online (Sandbox Code Playgroud)
应该给我:
{
foo: "a",
bar: "b",
}
Run Code Online (Sandbox Code Playgroud)
但是我得到了:
{
foo: "a",
bar: "b",
foobar: "c"
}
Run Code Online (Sandbox Code Playgroud)
我正在用这段代码序列化对象:
ObjectMapper mapper = new ObjectMapper();
String out = mapper.writeValueAsString(new Foo());
Run Code Online (Sandbox Code Playgroud)
我的类中字段的真实类型是Log4J Logger类的实例.我究竟做错了什么?
为什么在再次调用malloc()函数之前使用realloc()函数来调整动态分配的数组的大小而不是使用free()函数(即优缺点,优点与缺点等)?这是C编程,但我找不到合适的标签.提前致谢.
我正在使用Visual Studio 2008.
我知道std :: vector已经使用at()函数进行边界检查,并且如果您尝试使用operator []错误地访问某些内容(超出范围),则会有未定义的行为.
我很好奇是否可以使用边界检查来编译我的程序.这样,operator []将使用at()函数,并在某些事物超出范围时抛出std :: out_of_range.
将在没有边界检查operator []的情况下编译释放模式,因此性能不会降低.
我开始考虑这个问题,因为我正在将使用Borland C++编写的应用程序迁移到Visual Studio,并且在我的代码的一小部分中将其迁移(i = 0,j = 1):
v[i][j]; //v is a std::vector<std::vector<int> >
Run Code Online (Sandbox Code Playgroud)
向量'v'的大小为[0] [1](因此向量的元素0只有一个元素).这是未定义的行为,我知道,但是Borland在这里返回0,VS正在崩溃.我喜欢崩溃比返回0更好,所以如果我可以通过抛出std :: out_of_range异常得到更多'崩溃',迁移将更快完成(因此它会暴露更多Borland隐藏的错误).
我在.NET中开始一个新项目,需要一些几何算法,例如:
我找到了一些图书馆,但它们付费/昂贵,包括:
这些就是我需要的东西以及更多,这使我花费太多的钱在一些不会被这么多使用的东西上.
我发现了一些开源项目:
但是这些比我需要的少,但是,当你在谷歌上看时,它们很容易找到.经过一段时间的搜索,我找到了这个库:
哪个是我需要的大部分内容.它也是免费的,并按"原样"提供.这很好.
但是,如果您搜索谷歌"Tektosyne",您会发现很少的结果.所以我的问题是(对于那些在C#of StackOverflow中有一些"高级"几何使用经验的人):
你有另外的图书馆推荐或为什么这个图书馆不"受欢迎"?
我需要从std :: vector的中间删除元素.
所以我尝试过:
struct IsEven {
bool operator()(int ele)
{
return ele % 2 == 0;
}
};
int elements[] = {1, 2, 3, 4, 5, 6};
std::vector<int> ints(elements, elements+6);
std::vector<int>::iterator it = std::remove_if(ints.begin() + 2, ints.begin() + 4, IsEven());
ints.erase(it, ints.end());
Run Code Online (Sandbox Code Playgroud)
在此之后我会期望ints向量具有:[1,2,3,5,6].
在Visual Studio 2008的调试器中,std::remove_if在行之后,元素ints被修改,我猜我在这里遇到某种未定义的行为.
那么,如何从矢量范围中删除元素?
我在模拟软件中工作,在阵列上完成的许多操作之一是按数字缩放矢量.
我有这样的代码:
//Just some initialization code, don't bother about this part
int n = 10000;
std::vector<double> input(n, 42.0);
std::vector<double> output(input.size());
double alpha = 69.0;
//the actual calculation:
for (size_t i = 0; i < n; ++i) {
output[i] = input[i] * alpha;
}
Run Code Online (Sandbox Code Playgroud)
我有MKL库,所以如果我的计算是"就地"完成的,可以写下面的内容:
cblas_dscal(n, alpha, &input[0], 1);
Run Code Online (Sandbox Code Playgroud)
但是,这会改变input变量,这不是我想要的.
我试过使用mkl_domatcopy()但是这个操作非常慢.
我正在使用Visual C++ 2008 SP1.我有一个在调试模式下编译的应用程序,但在发布模式下链接到库.
我在启动应用程序时遇到了崩溃.为了缩小问题,我创建了一个包含2个项目的简单解决方案:
'lib_release'项目非常简单,只需要一个简单的类:
//Foo.h
#include <vector>
class Foo {
std::vector<int> v;
public:
void doSomething();
};
//Foo.cpp
#include "Foo.h"
void Foo::doSomething() {}
Run Code Online (Sandbox Code Playgroud)
'exec_using_lib_release'项目很简单,如下所示:
//main.cpp
#include "Foo.h"
int main() {
Foo foo;
foo.doSomething();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
它崩溃,这是由如何针对发布版本的lib(MSVCRT.lib)构建调试.exe(MSVCRTD.lib)报告的相同问题?,但他的回答对我不起作用.
我得到了相同的链接器警告,我尝试了相同的步骤,但没有一个工作.有什么我想念的吗?
编辑:
在lib_release(在发布模式下创建一个库),我正在使用Multi Threaded(/ MT),在exec_using_lib_release,我正在使用多线程调试(/ MTd).我认为这是实现它的预期方式,因为我希望在没有调试信息的情况下创建.lib.我在MSDN运行时库中阅读了该文档,这些是以静态方式链接CRT的设置.
我也没有"公共语言运行时支持".
我们有一些项目有CPPUnit测试,这些测试是使用ant脚本构建和运行来构建它们的(现在我们正在使用Borland C++,但我们正在转向VS2008).
问题是运行和查看测试结果的界面是令人不愉快的(命令提示符).让它们在eclipse或VS2008中运行会很棒.
如果一个插件我可以选择我想要运行的测试并获得一些视觉反馈(绿色条/红色条),指向我失败的测试和消息,这将好得多.
这与Eclipse中的JUnit(对于java)存在,但对于使用Eclipse CDT或VS2008的C++有类似的东西吗?UI测试运行器也很有用,因此我可以将UI作为Post构建操作启动.
编辑(可能的答案):
我找到了这个项目:ECUT,但我还没有测试过.看起来很有前途.一旦我获得了项目的更多经验,我就会更新这个问题.
我有一个类在一个公共方法中创建一个对象.该对象是私有的,对于该类的用户不可见.然后,此方法调用同一个类中的其他私有方法,并将创建的对象作为参数传递:
class Foo {
...
};
class A {
private:
typedef scoped_ptr<Foo> FooPtr;
void privateMethod1(FooPtr fooObj);
public:
void showSomethingOnTheScreen() {
FooPtr fooObj(new Foo);
privateMethod1(fooObj);
};
};
Run Code Online (Sandbox Code Playgroud)
我相信在这种情况下正确的智能指针将是一个scoped_ptr,但是,我不能这样做因为scoped_ptr使该类不可复制,如果以这种方式使用,所以我应该这样做的方法:
void privateMethod1(FooPtr& fooObj);
Run Code Online (Sandbox Code Playgroud)
privateMethod1不存储对象,也不保留对它的引用.只需从类Foo中检索数据.
正确的方法可能是根本不使用智能指针并在堆栈中分配对象,但这是不可能的,因为它使用的库不允许堆栈上的对象,它们必须位于堆上.
毕竟,我仍然对scoped_ptr的实际用法感到困惑.