考虑以下代码:
#include <vector>
void Example()
{
std::vector<TCHAR*> list;
TCHAR* pLine = new TCHAR[20];
list.push_back(pLine);
list.clear(); // is delete called here?
// is delete pLine; necessary?
}
Run Code Online (Sandbox Code Playgroud)
list.clear()是否在每个元素上调用delete?即我必须在list.clear()之前/之后释放内存吗?
可能重复:
我是否需要手动关闭ifstream?
我是否需要调用fstream.close()或是fstream一个正确的RAII对象,在销毁时关闭流?
我std::ofstream在方法中有一个本地对象.我可以假设退出此方法后文件总是关闭而不调用close吗?我找不到析构函数的文档.
我知道这memset(ptr, 0, nbytes)很快,但有更快的方法(至少在x86上)?
我假设memset使用mov,但是当大多数编译器将内存归零时,xor因为它更快,更正确吗?edit1:错了,因为GregS指出只适用于寄存器.我在想什么?
另外我问一个比我更熟悉汇编程序的人看看stdlib,他告诉我x86 memset没有充分利用32位宽的寄存器.然而当时我很累,所以我不太确定我是否理解正确.
edit2:我重新审视了这个问题并进行了一些测试.这是我测试的:
#include <stdio.h>
#include <malloc.h>
#include <string.h>
#include <sys/time.h>
#define TIME(body) do { \
struct timeval t1, t2; double elapsed; \
gettimeofday(&t1, NULL); \
body \
gettimeofday(&t2, NULL); \
elapsed = (t2.tv_sec - t1.tv_sec) * 1000.0 + (t2.tv_usec - t1.tv_usec) / 1000.0; \
printf("%s\n --- %f ---\n", #body, elapsed); } while(0) \
#define SIZE 0x1000000
void zero_1(void* buff, size_t size)
{
size_t i;
char* foo …Run Code Online (Sandbox Code Playgroud) 我有以下C++代码:
#include <math.h>
#include <cmath.h> // per http://www.cplusplus.com/reference/clibrary/cmath/abs/
// snip ...
if ( (loan_balance < 0) && (abs(loan_balance) > loan_payment) ) {
...
}
Run Code Online (Sandbox Code Playgroud)
并make爆炸:
error: call of overloaded 'abs(double)' is ambiguous
Run Code Online (Sandbox Code Playgroud)
也感兴趣:
/usr/include/stdlib.h:785: note: candidates are: int abs(int)
Run Code Online (Sandbox Code Playgroud)
如何指定编译器需要在cmath.h中调用可以处理浮点数的abs()?
编译器信息(不确定这是否重要):
[some_man@some_box ~/some_code]# gcc -v
Using built-in specs.
Target: i386-redhat-linux
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr /share/info --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-libgcj-multifile --enable-languages=c,c++,objc,obj-c++,java,fortran,ada --enable-java-awt=gtk --disable-dssi --enable-plugin --with-java-home=/usr/lib/jvm/java-1.4.2-gcj-1.4.2.0/jre --with-cpu=generic --host=i386-redhat-linux
Thread model: posix
gcc version 4.1.2 20080704 …Run Code Online (Sandbox Code Playgroud) 我需要std::map按值而不是按键排序.有一个简单的方法吗?
我从下面的线程中得到了一个解决方案:
std :: map按数据排序?
有更好的解决方案吗?
map<long, double> testMap;
// some code to generate the values in the map.
sort(testMap.begin(), testMap.end()); // is there any function like this to sort the map?
Run Code Online (Sandbox Code Playgroud) 允许用户向std命名空间添加显式特化.但是,有一些模板我明确禁止专业化.
我可以和不可以使用哪些模板?
我目前从一个向量写一组双打到一个文本文件,如下所示:
std::ofstream fout;
fout.open("vector.txt");
for (l = 0; l < vector.size(); l++)
fout << std::setprecision(10) << vector.at(l) << std::endl;
fout.close();
Run Code Online (Sandbox Code Playgroud)
但这需要花费大量时间才能完成.有没有更快或更有效的方法来做到这一点?我很乐意看到并学习它.
在这篇博客文章中,Eric Niebler表示:
std :: begin和std :: end有什么问题?惊喜!他们不安全.考虑一下这段代码的作用:
Run Code Online (Sandbox Code Playgroud)extern std::vector<int> get_data(); auto it = std::begin(get_data()); int i = *it; // BOOMstd :: begin对const和非const lvalues有两个重载.麻烦的是,rvalues绑定到const左值引用,导致上面的悬空迭代器.
我无法理解他的观点,为什么it是一个悬垂的参考.有人能解释一下吗
vector从a获取键和值的列表(作为a )的最有效方法是unordered_map什么?
具体来说,假设有问题的地图是一个unordered_map<string, double>.然后我想把键作为a vector<string>,并将值作为a vector<double>.
unordered_map<string, double> um;
vector<string> vs = um.enum_keys();
vector<double> vd = um.enum_values();
Run Code Online (Sandbox Code Playgroud)
我可以遍历地图并收集结果,但是有更有效的方法吗?有一个方法也适用于常规地图会很好,因为我可能会切换到那个.