Questions tagged «c++»

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

2
使用自定义类类型作为键的C ++ unordered_map
我正在尝试使用自定义类作为的键unordered_map,如下所示: #include <iostream> #include <algorithm> #include <unordered_map> using namespace std; class node; class Solution; class Node { public: int a; int b; int c; Node(){} Node(vector<int> v) { sort(v.begin(), v.end()); a = v[0]; b = v[1]; c = v[2]; } bool operator==(Node i) { if ( i.a==this->a && i.b==this->b &&i.c==this->c …





18
空终止字符串的基本原理是什么?
尽管我热爱C和C ++,但我还是忍不住选择以null结尾的字符串: 在C之前存在长度前缀(即Pascal)的字符串 长度前缀的字符串允许进行恒定的时间长度查找,从而使几种算法更快。 前缀字符串的长度使导致缓冲区溢出错误更加困难。 即使在32位计算机上,如果允许字符串成为可用内存的大小,则带前缀前缀的字符串也只比以空终止的字符串宽3个字节。在16位计算机上,这是一个字节。在64位计算机上,4GB是一个合理的字符串长度限制,但是即使您希望将其扩展为机器字的大小,64位计算机通常也具有足够的内存,使得多余的7个字节属于null参数。我知道原始的C标准是为极差的机器(就内存而言)编写的,但是效率论点在这里并没有卖给我。 几乎所有其他语言(例如Perl,Pascal,Python,Java,C#等)都使用长度前缀的字符串。这些语言通常在字符串操作基准中胜过C,因为它们在使用字符串时效率更高。 C ++使用std::basic_string模板对此进行了一些纠正,但是期望以null终止的字符串的纯字符数组仍然很普遍。这也是不完美的,因为它需要堆分配。 空终止的字符串必须保留一个字符(即null),该字符不能存在于字符串中,而长度前缀的字符串可以包含嵌入的null。 这些事情中,有几件事比C揭露的要新,因此C不必了解它们是有道理的。但是,在C出现之前,有几个很简单。为什么会选择空终止的字符串而不是明显更好的长度前缀? 编辑:由于上面我的效率问题上有人问了一些事实(并且不喜欢我已经提供的事实),因此它们源于以下几点: 使用空终止字符串的Concat需要O(n + m)的时间复杂度。长度前缀通常只需要O(m)。 使用空终止字符串的长度要求O(n)时间复杂度。长度前缀为O(1)。 长度和concat是迄今为止最常见的字符串操作。在几种情况下,以null终止的字符串可能更有效,但这种情况发生的频率要少得多。 从以下答案中可以看出,在某些情况下以null终止的字符串更有效: 当您需要切断字符串的开头并将其传递给某种方法时。即使允许销毁原始字符串,也不能真正在恒定时间内使用长度前缀来完成此操作,因为长度前缀可能需要遵循对齐规则。 在某些情况下,您只是逐个字符地遍历字符串,则可以保存CPU寄存器。请注意,这仅在您没有动态分配字符串的情况下才有效(因为您必须释放它,必须使用保存的CPU寄存器保存最初从malloc和friends获得的指针)。 以上都不是最常见的长度和连贯性。 下面的答案中还有一个断言: 您需要切断字符串的结尾 但这是不正确的-空终止和长度为前缀的字符串的时间相同。(以NULL结尾的字符串只是在您希望新的结尾处保留一个NULL,长度前缀只是从前缀中减去。)
281 c++  c  string  null-terminated 

18
如何打印出向量的内容?
我想在C ++中打印出向量的内容,这是我所拥有的: #include <iostream> #include <fstream> #include <string> #include <cmath> #include <vector> #include <sstream> #include <cstdio> using namespace std; int main() { ifstream file("maze.txt"); if (file) { vector<char> vec(istreambuf_iterator<char>(file), (istreambuf_iterator<char>())); vector<char> path; int x = 17; char entrance = vec.at(16); char firstsquare = vec.at(x); if (entrance == 'S') { path.push_back(entrance); …
281 c++  vector  output  stdvector  cout 


16
C ++结构初始化
是否可以按如下所示在C ++中初始化结构 struct address { int street_no; char *street_name; char *city; char *prov; char *postal_code; }; address temp_address = { .city = "Hamilton", .prov = "Ontario" }; 此处和此处的链接都提到只能在C中使用这种样式。如果可以,为什么在C ++中不能使用这种样式?是否有任何根本的技术原因导致不能在C ++中实现它,或者使用这种风格是一种不好的做法。我喜欢使用这种初始化方式,因为我的结构很大,而且这种样式使我清楚地知道了将哪个值分配给哪个成员。 如果还有其他方法可以实现相同的可读性,请与我分享。 在发布此问题之前,我已经参考了以下链接 适用于AIX的C / C ++ 具有变量的C结构初始化 使用C ++中的标签进行静态结构初始化 C ++ 11正确的结构初始化
279 c++ 


17
私有成员和受保护成员:C ++
有人可以启发我关于private和protected班级成员之间的区别吗? 我从最佳实践惯例中了解到,应该制作在类之外没有调用的变量和函数private-但是在我的MFC项目中,MFC似乎更受欢迎protected。 有什么区别,我应该使用哪个?
276 c++  class  mfc 

13
malloc()和free()如何工作?
我想知道如何malloc和free工作。 int main() { unsigned char *p = (unsigned char*)malloc(4*sizeof(unsigned char)); memset(p,0,4); strcpy((char*)p,"abcdabcd"); // **deliberately storing 8bytes** cout << p; free(p); // Obvious Crash, but I need how it works and why crash. cout << p; return 0; } 如果可能的话,我很感激如果答案在内存级别。

8
C ++中make_shared和常规shared_ptr的区别
std::shared_ptr<Object> p1 = std::make_shared<Object>("foo"); std::shared_ptr<Object> p2(new Object("foo")); 关于此的许多google和stackoverflow帖子,但是我不明白为什么make_shared比直接使用效率更高shared_ptr。 有人可以一步一步地说明我创建的对象和它们所完成的操作的顺序,以便使我能够理解make_shared效率。我在上面给出了一个例子供参考。
276 c++  c++11  shared-ptr 

23
删除重复项和对向量进行排序的最有效方法是什么?
我需要使用可能包含很多元素的C ++向量,删除重复项并对其进行排序。 我目前有以下代码,但无法正常工作。 vec.erase( std::unique(vec.begin(), vec.end()), vec.end()); std::sort(vec.begin(), vec.end()); 如何正确执行此操作? 另外,先擦除重复项(类似于上面的代码)还是先执行排序更快?如果我确实先执行排序,是否保证std::unique执行后仍保持排序? 还是有另一种(也许更有效)的方式来完成所有这些工作?
274 c++  sorting  vector  stl  duplicates 

11
什么时候应该在C ++中使用new关键字?
我使用C ++已有很短的时间了,而且我一直在想new关键字。简而言之,我应该使用它吗? 1)使用新关键字... MyClass* myClass = new MyClass(); myClass->MyField = "Hello world!"; 2)没有新关键字... MyClass myClass; myClass.MyField = "Hello world!"; 从实现的角度看,它们似乎没有什么不同(但是我敢肯定它们是...)。但是,我的主要语言是C#,当然第一种方法是我习惯的。 困难似乎是方法1与std C ++类一起使用更困难。 我应该使用哪种方法? 更新1: 最近,我将new关键字用于超出范围(即从函数返回)的大型数组的堆内存(或free store)。在使用堆栈之前,该堆栈导致一半的元素在范围之外损坏,切换到堆使用情况可确保元素完好无损。好极了! 更新2: 我的一个朋友最近告诉我,使用new关键字有一个简单的规则;每次键入时new,请键入delete。 Foobar *foobar = new Foobar(); delete foobar; // TODO: Move this to the right place. 这有助于防止内存泄漏,因为您始终必须将删除项放在某个位置(例如,将其剪切并粘贴到析构函数或其他方法时)。

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.