Questions tagged «c++»

C ++是一种通用编程语言。它最初被设计为C的扩展,并且具有类似的语法,但是现在它是一种完全不同的语言。使用此标记可解决有关将要使用C ++编译器编译的代码的问题。对于与特定标准修订版[C ++ 11],[C ++ 14],[C ++ 17]或[C ++ 20]等相关的问题,请使用特定于版本的标记。

10
超高性能C / C ++哈希图(表,字典)
关闭。此问题不符合堆栈溢出准则。它当前不接受答案。 想改善这个问题吗?更新问题,使其成为Stack Overflow的主题。 5年前关闭。 改善这个问题 我需要将原始键(int,也许很长)映射为高性能哈希映射数据结构中的结构值。 我的程序将包含几百个这样的映射,每个映射通常最多具有数千个条目。但是,这些地图会不断“刷新”或“搅动”;想象处理数以百万计add和delete消息的第二。 C或C ++中的哪些库具有适合此用例的数据结构?或者,您如何建议自己建造?谢谢!


11
如何在C ++ 11中获取整数线程ID
c ++ 11可能会获取当前的线程ID,但是它不能转换为整数类型: cout<<std::this_thread::get_id()<<endl; 输出:139918771783456 cout<<(uint64_t)std::this_thread::get_id()<<endl; 错误:从类型'std :: thread :: id'强制转换为类型'uint64_t'与其他类型相同:从类型'std :: thread :: id'强制转换类型为'uint32_t' 我真的不想做指针转换以获得整数线程ID。有某种合理的方法(因为我希望它是便携式的,所以是标准的)吗?

2
为什么在声明变量时,C ++允许我们在括号内将变量名括起来?
例如这样的声明: int (x) = 0; 甚至: int (((x))) = 0; 我偶然发现了这一点,因为在我的代码中我碰巧有一个类似于以下内容的片段: struct B { }; struct C { C (B *) {} void f () {}; }; int main() { B *y; C (y); } 显然,我想构造一个对象C,然后在其析构函数中做一些有用的事情。但是,在这种情况下,编译器将其C (y);视为y具有类型的变量声明,C因此它会显示有关y重新定义的错误。有趣的是,如果我以它C (y).f ()或类似的C (static_cast<B*> (y))方式编写它,它将按预期进行编译。当然,最好的现代解决方法是{}在构造函数调用中使用。 因此,正如我在此之后发现的那样,可以像这样int (x) = 0;或什至声明变量,int (((x))) = 0;但是我从未见过有人实际使用过这样的声明。因此,我很感兴趣-这种可能性的目的是什么,因为到目前为止,我看到它只会创建类似于臭名昭著的“最令人烦恼的分析”的案例,并且没有添加任何有用的信息?

3
重用已移动的容器?
重用已移动容器的正确方法是什么? std::vector<int> container; container.push_back(1); auto container2 = std::move(container); // ver1: Do nothing //container2.clear(); // ver2: "Reset" container = std::vector<int>() // ver3: Reinitialize container.push_back(2); assert(container.size() == 1 && container.front() == 2); 根据我在C ++ 0x标准草案中所读的内容;ver3似乎是正确的方法,因为移动后的对象位于 “除非另有规定,否则将这些移出的对象置于有效但未指定的状态。” 我从未发现过任何“以其他方式指定”的实例。 虽然我发现ver3有点round回,并且会更喜欢ver1,但是vec3可以允许进行其他一些优化,但另一方面很容易导致错误。 我的假设正确吗?

1
C ++ 11中字符串文字的Unicode编码
提出一个相关问题之后,我想问一下C ++ 11中新的字符和字符串文字类型。看来我们现在有四种字符和五种字符串文字。字符类型: char a = '\x30'; // character, no semantics wchar_t b = L'\xFFEF'; // wide character, no semantics char16_t c = u'\u00F6'; // 16-bit, assumed UTF16? char32_t d = U'\U0010FFFF'; // 32-bit, assumed UCS-4 和字符串文字: char A[] = "Hello\x0A"; // byte string, "narrow encoding" wchar_t B[] = L"Hell\xF6\x0A"; …

3
自C ++ 17起,具有正确地址和类型的指针仍然始终是有效的指针吗?
(参考此问答)。 在C ++ 17标准之前,[basic.compound] / 3中包含以下句子: 如果类型T的对象位于地址A,则将其值为地址A的cv T *类型的指针指向该对象,而不管如何获取该值。 但是从C ++ 17开始,此句子已删除。 例如,我相信这句话使此示例代码已定义,并且由于C ++ 17,这是未定义的行为: alignas(int) unsigned char buffer[2*sizeof(int)]; auto p1=new(buffer) int{}; auto p2=new(p1+1) int{}; *(p1+1)=10; 在C ++ 17之前,p1+1持有的地址*p2并具有正确的类型,因此*(p1+1)是的指针*p2。在C ++ 17p1+1中,指针是一个end-the-end,因此它不是指向对象的指针,并且我相信它是不可引用的。 是对标准权利的这种修改的解释,还是有其他规则可以补偿所引用句子的删除?

9
如何使用仅使用其中一个向量的条件以相同方式对两个向量进行排序?
如何使用仅使用其中一个向量的条件以相同方式对两个向量进行排序? 例如,假设我有两个大小相同的向量: vector<MyObject> vectorA; vector<int> vectorB; 然后,我vectorA使用一些比较功能进行排序。排序重新排序vectorA。如何将相同的重新排序应用于vectorB? 一种选择是创建一个结构: struct ExampleStruct { MyObject mo; int i; }; 然后排序包含的内容的矢量vectorA和vectorB压缩成单个载体: // vectorC[i] is vectorA[i] and vectorB[i] combined vector<ExampleStruct> vectorC; 这似乎不是理想的解决方案。还有其他选择,尤其是在C ++ 11中吗?
84 c++  c++11 



2
在c ++ 0x中删除nullptr是否仍然安全?
在c++03它是很清楚,删除一个空指针没有任何效果。实际上,明确指出§5.3.5/2: 在这两种选择中,如果delete操作数的值为空指针,则该操作无效。 但是,在当前的草案中c++0x似乎缺少这句话。在草案的其余部分中,我只能找到一些句子,说明如果delete-expression的操作数不是空指针常量,会发生什么情况。是否仍在中定义删除空指针c++0x,如果是,在哪里? 笔记: 有大量的间接证据表明它仍然定义明确。 首先,有两个句子§5.3.5/2说明 在第一个替代方案(删除对象)中,删除操作数的值可以为空指针值,... 和 在第二个替代方案(删除数组)中,删除操作数的值可以为空指针值或... 这些都说操作数被允许为空,但是就其本身而言,实际上并没有定义发生什么情况。 其次,改变的含义delete 0是重大的突破性变化,标准委员会不太可能做出此特定更改。此外,在c++0x草案的兼容性附件(附件C)中没有提到这是一个重大更改。但是,附件C是资料性的部分,因此不涉及本标准的解释。 另一方面,要求删除空指针无效的事实意味着需要进行额外的运行时检查。在许多代码中,操作数永远不能为null,因此此运行时检查与零开销原则冲突。也许委员会只是决定改变行为,使标准c ++更符合该语言的既定设计目标。

7
用gcc编译C ++程序
问题:如何使用gcc编译器编译C ++程序? info.c: #include<iostream> using std::cout; using std::endl; int main() { #ifdef __cplusplus cout << "C++ compiler in use and version is " << __cplusplus << endl; #endif cout <<"Version is " << __STDC_VERSION__ << endl; cout << "Hi" << __FILE__ << __LINE__ << endl; } 当我尝试编译时 info.c $ gcc …
84 c++  gcc  g++  gnu 

4
std :: flush如何工作?
有人可以解释(最好使用简单的英语)如何std::flush工作吗? 它是什么? 您什么时候冲洗河流? 它为什么如此重要? 谢谢。
84 c++  stream 

6
如何重定向qDebug,qWarning,qCritical等输出?
我在qDebug() <<调试输出中使用了很多语句。有什么跨平台的方法可以将调试输出重定向到文件,而无需使用Shell脚本?我猜想open()和dup2()将在Linux中完成这项工作,但可以在Windows中与MinGW一起编译吗? 也许有Qt方法可以做到?
84 c++  debugging  qt  mingw  qdebug 

3
在Windows上是__cdecl还是__stdcall?
我目前正在为Windows开发一个C ++库,该库将作为DLL分发。我的目标是最大程度地实现二进制互操作性。更确切地说,我的DLL中的功能必须可以从使用多个版本的MSVC ++和MinGW编译的代码中使用,而不必重新编译DLL。但是,我对哪种调用约定最好cdecl还是感到困惑stdcall。 有时我听到诸如“ C调用约定是唯一保证在整个编译器中都相同的声明”之类的语句,这与诸如“的解释存在某些变化cdecl,尤其是如何返回值”之类的语句形成对比。这似乎并未阻止某些库开发人员(如libsndfile)在其分发的DLL中使用C调用约定,而没有任何可见的问题。 另一方面,stdcall调用约定似乎定义明确。据我了解,基本上所有Windows编译器都必须遵循它,因为它是Win32和COM的约定。这是基于这样的假设:没有Win32 / COM支持的Windows编译器将不是很有用。论坛上发布的许多代码片段都声明了函数的功能,stdcall但我似乎找不到一个明确解释原因的帖子。 那里有太多相互矛盾的信息,我进行的每次搜索都会给我不同的答案,但这并不能真正帮助我在两者之间做出决定。我正在寻找一个清晰,详细,有争议的解释,以说明为什么我应该选择一个而不是另一个(或者为什么两者相等)。 请注意,这个问题不仅适用于“经典”的功能,而且还虚成员函数调用,因为大多数客户端代码将与我的DLL通过“接口”,纯虚类接口(以下模式,例如描述在这里和那里)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.