1 运算符
1.1 优先级
常见的运算符按照优先级从高到低的顺序:
- 一元运算符:
+、-、++、--、*(解引用)等- 算术运算符:
*、/、%- 算术运算符:
+、-- 移位运算符:
<<、>>- 关系运算符:
<、>、<=、>=- 相等运算符:
==、!=- 位运算符:
&- 位运算符:
^- 位运算符:
|- 逻辑运算符:
&&- 逻辑运算符:
||- 条件运算符:
?:- 赋值运算符:
=- 逗号运算符:
,(最低优先级)
1.2 vector:
在C++中,vector是一个动态数组,可以根据需要自动增长或缩小大小。它是标准模板库(STL)中的一部分,提供了许多有用的函数和操作,使得使用动态数组变得非常方便。
1创建vector:可以使用默认构造函数创建一个空的vector,也可以使用带有初始值的构造函数创建一个包含初始元素的vector。
// 创建空的vector
std::vector v1;
// 创建包含三个初始元素的vector
std::vector v2 = {1, 2, 3};
2 访问vector元素:可以使用下标运算符[]或者at()函数来访问vector中的元素
std::vector<int> v = {1, 2, 3};
// 使用下标运算符访问第二个元素
int second = v[1];
// 使用at()函数访问第三个元素
int third = v.at(2);
3 添加元素:可以使用push_back()函数在vector的末尾添加一个元素
std::vector v = {1, 2, 3};
// 在末尾添加一个元素
v.push_back(4);
4 删除元素:可以使用pop_back()函数删除vector末尾的一个元素,也可以使用erase()函数删除指定位置的一个或多个元素
std::vector<int> v = {1, 2, 3, 4};
// 删除末尾的一个元素
v.pop_back();
// 删除第二个元素
v.erase(v.begin() + 1);
5 获取vector大小:可以使用size()函数获取vector中元素的数量
std::vector<int> v = {1, 2, 3};
// 获取vector中元素的数量
int size = v.size();
6 遍历vector:可以使用for循环或者迭代器来遍历vector中的元素
std::vector<int> v = {1, 2, 3};
// 使用for循环遍历vector中的元素
for (int i = 0; i < v.size(); i++) {
std::cout << v[i] << " ";
}
// 使用迭代器遍历vector中的元素
for (auto it = v.begin(); it != v.end(); it++) {
std::cout << *it << " ";
}
需要注意的是,由于vector是一个动态数组,它可以自动增长或缩小大小,因此在访问vector元素时需要确保下标不越界。另外,由于vector是一个对象,因此在传递vector参数时应该使用引用,以避免不必要的复制。
#include <iostream>
#include <vector>
// 函数接受一个vector参数,并修改其中的元素
void modifyVector(std::vector<int>& vec) {
vec.push_back(4);
vec[0] = 10;
}
int main() {
std::vector<int> myVector = {1, 2, 3};
// 通过引用传递vector参数
modifyVector(myVector);
// 输出修改后的vector
for (int num : myVector) {
std::cout << num << " ";
}
return 0;
}
解析:
定义了一个名为modifyVector的函数,它接受一个vector参数,并在其中添加一个元素并修改第一个元素的值。注意函数参数的类型是std::vector&,表示传递的是一个vector的引用。 在main函数中,我们创建了一个vector对象myVector,然后将其传递给modifyVector函数。由于使用了引用传递,modifyVector函数直接操作了原始的myVector对象,而不是创建副本。因此,在函数结束后,我们可以看到myVector已经被修改。 总结起来,当需要在函数中修改vector对象时,应该使用引用作为参数类型。这样可以避免不必要的复制,并确保对原始对象的修改能够生效。
1.3 运算符重载
在C++中,运算符重载是一种特殊的函数重载,它允许我们为自定义类型定义运算符的行为。通过运算符重载,我们可以使用常见的运算符(如
+、-、*、/等)来操作自定义类型的对象,使代码更加简洁和直观。
允许我们为自定义的类或结构体定义操作符的行为。这样我们就可以使用自定义类型的对象,就像使用内置类型一样,使代码更加直观和易读。
举个例子,假设我们有一个名为Vector2的结构体,表示二维向量。我们可以通过重载+运算符来实现向量的加法操作,使得可以使用vector1 + vector2这样的语法来执行向量相加的操作。
代码示例1
#include <iostream>
class Complex{
private:
double real;
double imaginary;
public:
Complex(double r,double i):real(r),imaginary(i){}
//加法运算符的重载
Complex operator+(const Complex& other) const {
return Complex(real + other.real,imaginary + other.imaginary);
}
//输出运算符的重载
friend std::ostream& operator<<(std::ostream& os, const Complex& c ){
os << c.real << "+" << c.imaginary << "i";
return os;
}
};
int main(){
Complex c1(2.0, 3.0);
Complex c2(1.0, 2.0);
//使用加法运算符重载
Complex result = c1 + c2;
std::cout << "result:" << result << std::endl;
return 0;
}
代码示例2
#include <iostream>
#include <string>
struct Vector2
{
float x,y;
Vector2(float x, float y)
: x(x), y(y) {}
Vector2 Add(const Vector2& other) const
{
return Vector2(x + other.x, y + other.y);
}
Vector2 operator+(const Vector2& other) const
{
return Add(other);
}
Vector2 Multiply(const Vector2& other) const
{
return Vector2(x * other.x, y * other.y);
}
Vector2 operator*(const Vector2& other)const
{
return Multiply(other);
}
bool operator==(const Vector2& other) const
{
return x == other.x && y == other.y;
}
bool operator!=(const Vector2& other) const
{
return !(*this == other);
}
};
std::ostream& operator << (std::ostream& stream, const Vector2& other)
{
stream << other.x << "," << other.y;
return stream;
}
int main()
{
Vector2 position(4.0f, 4.0f);
Vector2 speed(0.5f, 1.5f);
//Vector2 result = position.Add(speed);
Vector2 powerup(1.1f, 1.1f);
Vector2 result1 = position.Add(speed.Multiply(powerup));
Vector2 result2 = position + speed * powerup;
std::cout << result2 << std::endl;
std::cin.get();
}