为了唯一地识别每个设备,我想使用IMEI(或CDMA设备的ESN号码).如何以编程方式访问?
我正在大量使用,std::set<int>而且我经常需要检查这样的集合是否包含数字.
我觉得写作很自然:
if (myset.contains(number))
...
Run Code Online (Sandbox Code Playgroud)
但由于缺少一名contains成员,我需要编写繁琐的内容:
if (myset.find(number) != myset.end())
..
Run Code Online (Sandbox Code Playgroud)
或者不那么明显:
if (myset.count(element) > 0)
..
Run Code Online (Sandbox Code Playgroud)
这个设计决定有理由吗?
我是一个网站的维护者,据称"丢失"了源代码到flash swf文件.我该如何反编译这个来源?
我可以使用在线或离线的任何程序吗?
我正在使用一个外部库,它在某些时候给了我一个指向整数数组和大小的原始指针。
现在我想使用std::vector来访问和修改这些值,而不是使用原始指针访问它们。
这是一个解释这一点的人为示例:
size_t size = 0;
int * data = get_data_from_library(size); // raw data from library {5,3,2,1,4}, size gets filled in
std::vector<int> v = ????; // pseudo vector to be used to access the raw data
std::sort(v.begin(), v.end()); // sort raw data in place
for (int i = 0; i < 5; i++)
{
std::cout << data[i] << "\n"; // display sorted raw data
}
Run Code Online (Sandbox Code Playgroud)
预期输出:
1
2
3
4
5
Run Code Online (Sandbox Code Playgroud)
原因是我需要<algorithm>在该数据上应用算法(排序、交换元素等)。
在另一方面改变这种载体的大小将永远不会改变,因此push_back, …
我尝试过的所有C编译器都不会在下面的代码片段中检测到未初始化的变量.但这种情况在这里显而易见.
不要打扰这个代码段的功能.这不是真正的代码,我把它剥离下来调查这个问题.
BOOL NearEqual (int tauxprecis, int max, int value)
{
int tauxtrouve; // Not initialized at this point
int totaldiff; // Not initialized at this point
for (int i = 0; i < max; i++)
{
if (2 < totaldiff) // At this point totaldiff is not initialized
{
totaldiff = 2;
tauxtrouve = value; // Commenting this line out will produce warning
}
}
return tauxtrouve == tauxprecis ; // At this point tauxtrouve is potentially
// not …Run Code Online (Sandbox Code Playgroud) IP_ADAPTER_INFO *ptr=new IP_ADAPTER_INFO[100];
Run Code Online (Sandbox Code Playgroud)
如果我免费使用
delete ptr;
Run Code Online (Sandbox Code Playgroud)
它会导致内存泄漏,如果不是那么为什么?
这是VS2005生成的反汇编代码
; delete ptr;
0041351D mov eax,dword ptr [ptr]
00413520 mov dword ptr [ebp-0ECh],eax
00413526 mov ecx,dword ptr [ebp-0ECh]
0041352C push ecx
0041352D call operator delete (4111DBh)
00413532 add esp,4
; delete []ptr;
00413535 mov eax,dword ptr [ptr]
00413538 mov dword ptr [ebp-0E0h],eax
0041353E mov ecx,dword ptr [ebp-0E0h]
00413544 push ecx
00413545 call operator delete[] (4111E5h)
0041354A add esp,4
Run Code Online (Sandbox Code Playgroud) 我即将将大量旧的 C++ 代码转换为更现代的 C++。
该代码中有许多原始的二维数组,例如:
Foo bar[XSIZE][YSIZE];
Run Code Online (Sandbox Code Playgroud)
我即将用以下内容替换这些声明
std::array<std::array<Foo, YSIZE>, XSIZE> bar;
Run Code Online (Sandbox Code Playgroud)
这是一种方便的方法,因为语句保持不变,并且代码的行为应该与原始数组相同,并且具有能够在调试版本中进行越界检查的额外好处。
但在我看来,这std::array<std::array<Foo, YSIZE>>有点麻烦而且不容易阅读,而且如果使用 3D 数组(虽然我没有),情况会更糟。
现在我正在使用这个宏来使声明更具可读性:
#define DECLARE_2D_ARRAY(type, x, y) std::array<std::array<type, y>, x>
...
DECLARE_2D_ARRAY(Foo, XSIZE, YSIZE) bar;
Run Code Online (Sandbox Code Playgroud)
但我觉得这是一个宏黑客,我想知道是否有一种更干净、更 C++ 的方法来做类似的事情。
这并不是着名的浮动点数学的重复,即使它看起来像乍一看.
我正在double从一个文本文件中读取一个文件fscanf(file, "%lf", &value);,并将其与==操作符进行比较,并与双文字进行比较.如果字符串是相同的文字,将使用对比==是true在所有情况下?
例
文字文件内容:
7.7
Run Code Online (Sandbox Code Playgroud)
代码段:
double value;
fscanf(file, "%lf", &value); // reading "7.7" from file into value
if (value == 7.7)
printf("strictly equal\n");
Run Code Online (Sandbox Code Playgroud)
预期和实际产出是
strictly equal
Run Code Online (Sandbox Code Playgroud)
但是这假设编译器将双文字7.7转换为与fscanf函数完全相同的双精度,但编译器可能会也可能不会使用相同的库将字符串转换为double.
或者另外要求:从字符串到double的转换是否会导致唯一的二进制表示形式,或者可能存在轻微的实现依赖性差异?
我需要std::array使用常量值初始化a的所有元素,就像可以使用来完成一样std::vector。
#include <vector>
#include <array>
int main()
{
std::vector<int> v(10, 7); // OK
std::array<int, 10> a(7); // does not compile, pretty frustrating
}
Run Code Online (Sandbox Code Playgroud)
有没有办法优雅地做到这一点?
现在我正在使用这个:
std::array<int, 10> a;
for (auto & v : a)
v = 7;
Run Code Online (Sandbox Code Playgroud)
但我想避免使用显式代码进行初始化。
我有以下模式:
std::vector包含对象的原始指针(我知道原始指针是"邪恶的",但它是需要维护的遗留软件).伪代码:
for each pointer in vector
{
if (SomeTest(pointer))
{
DoSomething(pointer)
delete pointer
remove pointer from vector
}
}
Run Code Online (Sandbox Code Playgroud)
我无法想出一些干净利落的代码.
这个链接提供了不同的方法,但它们看起来或多或少都很麻烦.
我现在使用的繁琐解决方案:
for(auto & p : v)
{
if (SomeTest(p))
{
DoSomething(p);
delete p;
p = nullptr;
}
}
v.erase(std::remove(v.begin(), v.end(), nullptr), v.end());
Run Code Online (Sandbox Code Playgroud)