C++ 在C++;是否可以使用指针魔术同时修改多个结构对象?

C++ 在C++;是否可以使用指针魔术同时修改多个结构对象?,c++,C++,抱歉,这可能是一个愚蠢的问题,而且可能非常基本 我使用的库有一个矩形结构,如下所示: struct Rectangle { int x; int y; int width; int height; } 我在一个std::vector中有许多这样的矩形,它们之间总是有相同的x值(但所有其他变量都可能不同) 有没有一种方法可以让我使用指针魔法,创建一个变量cur_x,并让std::vector中所有对象的x将它们的值更改为我设置的值 这个结构是由库提供的,所以我不能修改它,我试图避

抱歉,这可能是一个愚蠢的问题,而且可能非常基本

我使用的库有一个
矩形
结构,如下所示:

struct Rectangle {
  int x;
  int y;
  int width;
  int height;
}
我在一个
std::vector
中有许多这样的矩形,它们之间总是有相同的
x
值(但所有其他变量都可能不同)

有没有一种方法可以让我使用指针魔法,创建一个变量
cur_x
,并让
std::vector
中所有对象的
x
将它们的值更改为我设置的值


这个结构是由库提供的,所以我不能修改它,我试图避免迭代
std::vector
的所有元素来更改它们的
x
值。创建我自己的自定义结构也不是一个选项。

这听起来不像是您设置的约束。我能想到的唯一一件事(但在我看来仍然是危险的,不是一个好主意)是,如果你能以某种方式强制所有的
x
变量在内存中是连续的,然后你可以用一些内存设置技巧一次性设置它们。但是考虑到您不能修改
矩形
结构,我看不出这是怎么可能的


您的情况可以归结为这样一个事实:您需要在多个位置设置内存,唯一的方法是设置多个集合(并且可能最好使用循环)

听起来与您设置的约束不同。我能想到的唯一一件事(但在我看来仍然是危险的,不是一个好主意)是,如果你能以某种方式强制所有的
x
变量在内存中是连续的,然后你可以用一些内存设置技巧一次性设置它们。但是考虑到您不能修改
矩形
结构,我看不出这是怎么可能的


您的情况归结为需要在多个位置设置内存,唯一的方法是设置多个集合(可能最好使用循环)

如果向量中所有元素的X值相同,并且将保持这种方式,我能想到的最好办法是键入另一个
矩形
结构的副本,并将
int x
更改为
int*x
,类似这样

//Somewhere global-ish
typedef struct {
    int* x;
    int y, width, height;
} rectangle;

int cur_X = 10;

for (int i=0; i < rectangleVector.size(); i++){
    rectangleVector[i].x = &cur_x;
}

std::cout << *rectangleVector[0].x << std::endl;

//
类型定义结构{
int*x;
长度、宽度、高度;
}矩形;
int cur_X=10;
对于(int i=0;istd::cout如果向量中所有元素的X值都是相同的,并且它将保持不变,那么我能想到的最好办法是键入另一个
矩形的副本,并将
int X
更改为
int*X
,类似这样

//Somewhere global-ish
typedef struct {
    int* x;
    int y, width, height;
} rectangle;

int cur_X = 10;

for (int i=0; i < rectangleVector.size(); i++){
    rectangleVector[i].x = &cur_x;
}

std::cout << *rectangleVector[0].x << std::endl;

//
类型定义结构{
int*x;
长度、宽度、高度;
}矩形;
int cur_X=10;
对于(int i=0;i从我阅读其他评论后的理解来看,首先,您需要立即更改所有注释,其次,您不能使用指针。所以我建议用另一种方式修改Rectange

struct Rectangle {
  static int x;
  int y;
  int width;
  int height;
};
static关键字将确保只为所有矩形对象分配一个内存空间,因此更改它一次将使所有对象设置为相同的值。另外,由于成员
x
仍然是
int
,因此即使在重载之后,所有函数的工作方式都是相同的。(确保没有函数正在创建矩形的临时副本或将x设置为临时值)


要创建多组矩形,每组都有自己的
x
,可以使用引用。引用将确保
std::vector
中的所有矩形对象指向一个内存位置,同时允许两个不同的向量之间存在不同的内存位置

#include <iostream>
#include <vector>

struct Rectangle
{
    int &x;
    int y;
    int width;
    int height;
    Rectangle(int &_x):x(_x){}
};

int main()
{
    int cur_1 = 10;
    int cur_2 = 20;
    std::vector<Rectangle> Group_1(100, Rectangle(cur_1));
    std::vector<Rectangle> Group_2(200, Rectangle(cur_2));
    
    std::cout << Group_1[0].x << " " << Group_1[50].x << "\n";
    std::cout << Group_2[0].x << " " << Group_2[50].x << "\n";
    Group_1[0].x = 12;
    Group_2[0].x = 14;
    std::cout << Group_1[0].x << " " << Group_1[50].x << "\n";
    std::cout << Group_2[0].x << " " << Group_2[50].x << "\n";

}

因此,如果您更改
Group_1
cur_1
的任何元素的
x
,则
Group_1
的所有成员都将更改其
x
,但是,与此同时,您可以为组2拥有相同的属性,同时保留与组1不同的值。

根据我阅读其他注释后的理解,首先,您需要一次性更改所有属性,其次,您不能使用指针。所以我建议用另一种方式修改Rectange

struct Rectangle {
  static int x;
  int y;
  int width;
  int height;
};
static关键字将确保只为所有矩形对象分配一个内存空间,因此更改它一次将使所有对象设置为相同的值。另外,由于成员
x
仍然是
int
,因此即使在重载之后,所有函数的工作方式都是相同的。(确保没有函数正在创建矩形的临时副本或将x设置为临时值)


要创建多组矩形,每组都有自己的
x
,可以使用引用。引用将确保
std::vector
中的所有矩形对象指向一个内存位置,同时允许两个不同的向量之间存在不同的内存位置

#include <iostream>
#include <vector>

struct Rectangle
{
    int &x;
    int y;
    int width;
    int height;
    Rectangle(int &_x):x(_x){}
};

int main()
{
    int cur_1 = 10;
    int cur_2 = 20;
    std::vector<Rectangle> Group_1(100, Rectangle(cur_1));
    std::vector<Rectangle> Group_2(200, Rectangle(cur_2));
    
    std::cout << Group_1[0].x << " " << Group_1[50].x << "\n";
    std::cout << Group_2[0].x << " " << Group_2[50].x << "\n";
    Group_1[0].x = 12;
    Group_2[0].x = 14;
    std::cout << Group_1[0].x << " " << Group_1[50].x << "\n";
    std::cout << Group_2[0].x << " " << Group_2[50].x << "\n";

}

因此,如果您更改
Group_1
cur_1
的任何元素的
x
,则
Group_1
的所有成员都将更改其
x
,但同时您可以在保留与Group_1不同的值的同时,为
Group_2
拥有相同的属性。

恐怕不会。由于结构的
x
成员本身不是指针,因此无法使其指向其他对象。如果要在类的所有对象之间共享变量,只需将其声明为静态。将其更改为一个将使其作为单个内存位置显示在所有对象中。但是,您永远无法创建值不同的新对象。在所有对象中都是一样的。不清楚这是否符合你的需要。是吗