gpt4 book ai didi

c++ - 用对另一个 vector 的引用填充一个 vector

转载 作者:太空宇宙 更新时间:2023-11-04 12:44:03 24 4
gpt4 key购买 nike

我有一个表示点 (allPoints) 的结构 vector 。该 vector 包含给定平面上的整个点集合(在本例中它包含四个点)。每个结构包含一对代表一个点的整数、一个标志,以及另一个包含平面上所有其他点的点 vector 。

我想要做的是从点的偏好列表中选择一个点,更改其标志,并将此更改应用于 allPoints vector 中的点。我想我需要一个引用 vector 或类似的东西。这是我正在谈论的示例:

#include <iostream>
#include <string>
#include <vector>
#include <utility>

using namespace std;

struct Point {
pair<int,int> p;
vector<Point> prefs;
bool flag = true;
};

void fillVectors(vector<Point> & allPoints);
void printState(vector<Point> & allPoints);

int main()
{
vector<Point> allPoints;

fillVectors(allPoints);
printState(allPoints);

// I want to go into the preference list of any given point, select a point, and change its flag. This change
// should be reflected in the allPoints vector, not just the preferences vector

allPoints[0].prefs[2].flag = false;

printState(allPoints);

// The flags have not changed. If I searh for the point in allPoints, then change the flag, it will change
for(Point p : allPoints)
{
if(p.p == allPoints[0].prefs[2].p) allPoints[0].flag = false;


}
printState(allPoints);
}

void fillVectors(vector<Point> & allPoints)
{

pair<int,int> p1 = make_pair(0,0);
pair<int,int> p2 = make_pair(5,0);
pair<int,int> p3 = make_pair(3,7);
pair<int,int> p4 = make_pair(2,9);
vector<pair<int,int>> coords = {p1, p2, p3, p4};

for(int i = 0; i < coords.size(); i++)
{
Point newPoint;
newPoint.p = coords[i];
allPoints.push_back(newPoint);
}

// Fill the preference lists with every other point (in no particular order)
for(int i = 0; i < allPoints.size(); i++)
{
for(int j = 0; j < allPoints.size(); j++)
{
if(i == j) continue; // Do not put a point in its own preference list
allPoints[i].prefs.push_back(allPoints[j]);
}

}
}

void printState(vector<Point> & allPoints)
{
cout << "Contents of all points:\n";

for(Point p : allPoints)
cout << "point: (" << p.p.first << "," << p.p.second << ")" << " Flagged? -> " << p.flag << "\n";
cout << "~\nContents of each preference vector:\n";

for(Point p : allPoints)
{
cout << "point: (" << p.p.first << "," << p.p.second << ")\tprefs: ";
for(Point q : p.prefs)
cout << "(" << q.p.first << "," << q.p.second << "), ";
cout << "\n";

}
cout << "--------------------\n";
}

在这里,我有包含四对的 allPoints。打印状态函数打印所有点中的每个点及其标志,然后是每个点的偏好列表。我需要的是每个点中的 prefs vector 在 allPoints vector 中保存对该点对象的引用。相反,它似乎只是在复制。

我想这样做,以便我可以在 O(1) 时间内更改点标志,而不是从首选项中获取点所需的 O(n) 时间,然后在 allPoints 中搜索并更改它

最佳答案

如果您想要共享的状态的唯一部分是 flag如果您不打算更改 Point::p 的值member 一旦对象被创建,你可以替换bool flagstd::shared_ptr<bool> flag以及何时创建拷贝 - shared_ptr将被复制,它将保存对象之间共享的值。

struct Point
{
Point(const std::pair<int,int>& value)
: p(value)
{}

Point(const Point&) = default;
Point& operator = (const Point&) = default;

const std::pair<int,int> p;
vector<Point> prefs;
std::shared_ptr<bool> flag = std::make_shared<bool>(true);
};

那么如果你愿意:

Point pt1({1,2});
auto pt2 = pt1;

std::cout << *pt2.flag << " ";
*pt1.flag = false;
std::cout << *pt2.flag << " ";

pt1 以来,输出将为“1 0”和 pt2对象共享相同的 bool .

注意:如果没有const对于 Point::p然后可以在创建对象的拷贝后更改它的值 - 在这种情况下共享 flag对于这样的对象没有意义。

当然,鉴于所有成员都是公开的,这很容易破解,因此您需要访问 flag小心。为了使此代码安全 - 应使用封装。

关于c++ - 用对另一个 vector 的引用填充一个 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52597834/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com