Studiennotizen zum Python-zu-C++-Format

Ich schreibe hauptsächlich Python, aber ich habe das Gefühl, dass ich, wenn ich den Algorithmus verbessern möchte, ihn immer noch in C++ schreiben muss, sodass die Notizen hauptsächlich den Unterschied zwischen C++ und Python aufzeichnen. In der weißen Box befindet sich Ihr eigenes Verständnis, das jeder versteht die Essenz und entsorgt die Schlacke

Kopfdatei

include <iostream>   /主要包含cin和cout基本输入输出流
include <cstdio>     /主要包含scanf和printf输入输出函数

Wenn der Datenumfang groß ist, ist die Geschwindigkeit von scanf und printf viel schneller als die von cin und cout, aber nachdem ich persönlich einige Fragen gestellt hatte, gab es keinen solchen Grund, der zu einer Zeitüberschreitung führte, sodass ich sie nach meinen eigenen Vorstellungen verwenden kann Gewohnheiten (persönlich, wenn die
Ausgabe Formatanforderungen hat, z. B. Gleitkommazahlen, verwende printf, und ich bin es gewohnt, cout zu verwenden, weil es schneller zu schreiben ist)

using namespace std;

Wenn Sie an der Funktion dieser Anweisung interessiert sind, können Sie sie selbst überprüfen. Einige Compiler fügen sie standardmäßig hinzu, aber ich bin es gewohnt, sie selbst zu schreiben.

Universelle Header-Datei, einschließlich aller Bibliotheksfunktionen, die von C++ verwendet werden können

#include <bits/stdc++.h>

Hauptfunktion

Grundformat

! Beachten Sie, dass Variablen im Voraus definiert werden müssen

#include <iostream>
#include <cstdio>

using namespace std;

int main()
{
    
    
	int n;
	cin >> n; /输入
	cout << n << endl; /输出
	return 0;
}

Zyklus

Beispiel: Primzahlen im Bereich von 1-100 drucken

Fügen Sie hier eine Bildbeschreibung ein

Array

Initialisieren Sie das Array

Fügen Sie hier eine Bildbeschreibung ein
Array-Operation

访问数组的方式与python一致
/求元素个数
cout << sizeof(arr) / sizeof(arr[0]) << endl; 

Mehrdimensionale Arrays

Fügen Sie hier eine Bildbeschreibung ein

Zeichenarray

Eine Zeichenfolge ist ein Array aus Zeichen plus dem Abschlusszeichen „\0“.
Zeichenfolgen können zum Initialisieren von Zeichenarrays verwendet werden. An dieser Stelle ist jedoch zu beachten, dass am Ende jeder Zeichenfolge ein „\0“-Zeichen impliziert ist. Daher muss die Länge des Zeichenarrays mindestens 1 größer sein als die Länge der Saite!

Fügen Sie hier eine Bildbeschreibung ein

Allgemeine Operationen an Zeichenarrays

下面几个函数需要引入头文件:
#include <string.h>
(1)	strlen(str),求字符串的长度
(2)	strcmp(a, b),比较两个字符串的大小,a < b 返回-1,a == b 返回0,a > b返回1。这里的比较方式是字典序!
(3)	strcpy(a, b),将字符串b复制给从a开始的字符数组。

Zeichenfolge vom Typ Zeichenfolge

Eine Zeichenfolge variabler Länge ist nützlicher als ein Zeichenarray. Header-Dateien müssen importiert werden:
#include <string>

String bekommen

getline(cin, num);

/其中 cin 是正在读取的输入流,而 num 是接收输入字符串的 string 变量的名称

Fügen Sie hier eine Bildbeschreibung ein
Geben Sie die gesamte Zeichenfolge aus

#include < iostream>
#include < string>

using namespace std;

int main()
{
    
    
    string s1;
    
    cin >> s1;

    printf("%s", s1.c_str());
    
    return 0;
}

Saitenkonstruktionsaufgabe + Spleißen

#include <string>

void text2()
{
    
       
    string s1;
    s1 = "hello world";
    s1 += "C++"

    const char * str = "hello world"; /const 限定符,它把一个对象转换成一个常量
    string s2(str);

    string s3(s2);

    string s4(5,'a'); /aaaaa
}

andere Operationen

1)查找
string str1 = "abcdef";
int a = str1.find("def");
2)替换
string str2 = "aaabbb"
str2.replace(3,3,"aaa")
3)比较
str1.compare(str2) == 0相等
>0 str1大
<0 str2大
4)字符存取
string str1 = "hello";
for (int i = 0; i < str.size(); i++)
{
    
    
    cout << str[i] << " ";
    cout << str.at(i) << " ";
} 
cout << endl;
5)字符串修改
str[0] = 'a';
6)插入,删除
string str = "hello";
str.insert(1,"zzz");
sr.erase(1,3) //开始位置,几个
7)求字串
string str = "abcdefg";
string s = str.substr(1,3);
8)count
count(s.begin(),s.end(),'a');

C++ STL

STL ist ein leistungsstarkes Werkzeug zur Verbesserung der Effizienz des C++-Schreibens. - insgesamt

1) Vektorcontainer

Struktur

void text3()
{
    
    
    vector<int>v1; /默认构造,无参构造
    for (int i = 0; i < 10; i++)
    {
    
    
        v1.push_back(i)
    }
    printVector(v1);

    /通过区间方式进行构造
    vector<int>v2(v1.begin(),v1.end());

    /n个elem方式构造
    vector<int>v3(10,100);

    /拷贝构造
    vector<int>v3(v4);
}

Traverse

#include <vector>
#include <algorithm> /标准算法头文件

void myPrint(int val)
{
    
    
    cout << val << endl;
}


void text1()
{
    
    
    vector<int> v;
    /向容器中插入数据
    v.push_back(10);
    v.push_back(20);

    /通过迭代器访问容器中的数据
    vector<int>::iterator itBegin = v.begin(); /起始迭代器,指向容器中第一个元素
    vector<int>::iterator itEnd = v.end(); //结束迭代器,指向容器中最后一元素的下一个位置

    /遍历方式一
    while (itBegin != itEnd)
    {
    
    
        cout << *itBegin << endl;
        itBegin++;
    }

    /遍历方式二
    for(vector<int>::iterator it = v.begin(); it != v.end();it++)
    {
    
    
        cout << *it << endl;
    }

    /遍历方式三
    for_each(v.begin(), v.end(), myPrint);
}

Weitere Betriebsfunktionen

size()/empty()
size函数返回vector的实际长度(包含的元素个数),empty函数返回一个bool类型,表明vector是否为空。二者的时间复杂度都是O(1)。

所有的STL容器都支持这两个方法,含义也相同,之后我们就不再重复给出。
begin()/end()
begin函数返回指向vector中第一个元素的迭代器。例如a是一个非空的vector,则*a.begin()与a[0]的作用相同。
front()/back()
front函数返回vector的第一个元素,等价于*a.begin() 和 a[0]。
back函数返回vector的最后一个元素,等价于*==a.end() 和 a[a.size()1]
push_back()pop_back()
a.push_back(x) 把元素x插入到vector a的尾部。
b.pop_back() 删除vector a的最后一个元素。
sort()排序
#include <algorithm>
sort(d.begin(), d.end());
/倒序
sort(d.rbegin(),d.rend());
用swap收缩内存
vector<int>(v).swap(v);
预留空间
v.reserver(10000)

2) Behälter einstellen

Features und Elemente werden beim Einfügen automatisch sortiert und doppelte Werte sind nicht zulässig

Doppelte Werte dürfen zwischen C++ und Python nicht gemeinsam sein, aber die Menge von Python ist ungeordnet, während C++ geordnet ist

Der Header-Dateisatz enthält hauptsächlich zwei Container, Set und Multiset, die „geordneter Satz“ und „geordneter Multisatz“ sind, dh die Elemente des ersteren können nicht wiederholt werden, während der letztere mehrere gleiche Elemente enthalten kann. Die interne Implementierung von Set und Multiset ist ein Rot-Schwarz-Baum, und die von ihnen unterstützten Funktionen sind grundsätzlich dieselben.

#include<set>
set<int>s;
/插入数据
s.insert(10);
s.insert(20);
/拷贝构造
set<int>s2(s1);
/判断为空
if (s.empty())
/大小
s.size()
insert(elem) //插入
clear() /清除所有元素
erase(pos) / 删除pos迭代器所指的元素,返回下一个元素的迭代器 s.begin() s.end()
erase(begin,end) /删除区间所有元素,返回下一个元素的迭代器
erase(elem) /删除容器中值为elem的元素
find() //不存在返回set.end()
count() //统计个数0/1
lower_bound()/upper_bound()
这两个函数的用法与find类似,但查找的条件略有不同,时间复杂度为 O(logn)。
s.lower_bound(x) 查找大于等于x的元素中最小的一个,并返回指向该元素的迭代器。
s.upper_bound(x) 查找大于x的元素中最小的一个,并返回指向该元素的迭代器。
/利用仿函数指定set容器的排序规则

class MyCompare
{
    
    
public:
    bool operator()(int v1, int v2) const
    {
    
    
        return v1 > v2;
    }
}
set<int,MyCompare>s2;

3) Deque-Container

Eine doppelendige Warteschlangen-Deque ist ein kontinuierlicher linearer Speicherplatz, der das effiziente Einfügen oder Löschen von Elementen an beiden Enden unterstützt. Es ist wie eine Kombination aus Vektor und Warteschlange. Im Vergleich zum Vektor benötigt Deque nur O(1) Zeit, um Elemente am Kopf hinzuzufügen und zu löschen. Im Vergleich zur Warteschlange unterstützt Deque den Direktzugriff wie ein Array.

[] 随机访问
begin/end,返回deque的头/尾迭代器
front/back 队头/队尾元素
push_back 从队尾入队
push_front 从队头入队
pop_back 从队尾出队
pop_front 从队头出队
clear 清空队列

4) Kartencontainer

Der Kartencontainer ist eine Schlüssel-Wert-Paar-Schlüssel-Wert-Zuordnung, und seine interne Implementierung ist ein rot-schwarzer Baum mit Schlüssel als Schlüsselcode. Der Schlüssel und der Wert von Map können von beliebigem Typ sein.

声明
map<key_type, value_type> name;
例如:
map<long, long, bool> vis;
map<string, int> hash;
map<pair<int, int>, vector<int>> test;
size()/empty()/clear()/begin()/end()均与set类似。
insert()/erase()
与set类似,但其参数均是pair<key_type, value_type>
find()
h.find(x) 在变量名为h的map中查找key为x的二元组。
[]操作符
h[key] 返回key映射的value的引用,时间复杂度为O(logn)[]操作符是map最吸引人的地方。我们可以很方便地通过h[key]来得到key对应的value,还可以对h[key]进行赋值操作,改变key对应的value。

Ergänzende Wissenspunkte

#include <cmath > Enthält einige häufig verwendete mathematische Funktionen

1ceil(x)      /向上取整 
2floor(x) 	/向下取整
3fabs(x) 		/x的绝对值 
4sqrt(x) 		/x的平方根 
5pow(x,y) 	/x的y次幂

Definition und Ein- und Ausgabe von Gleitkommazahlen

double r;
scanf("%lf", &r);
printf("%.4lf", r * r); /四位小数;
/%8.3f, 表示这个浮点数的最小宽度为8,保留3位小数,当宽度不足时在前面补空格
/%-8.3f,表示最小宽度为8,保留3位小数,当宽度不足时在后面补上空格
/%08.3f, 表示最小宽度为8,保留3位小数,当宽度不足时在前面补上0

Generieren Sie Zufallszahlen

#include <stdlib.h>
#include <ctime>

srand((unsigned int) time(NULL)); /添加随机数种子,防止每次随机数一样
int num = rand()%100  /生成0 ~ 99随机数

Ich denke du magst

Origin blog.csdn.net/qq_46500711/article/details/128583186
Empfohlen
Rangfolge