Перегрузка оператора[] с++
Есть структура данных, полями которой являются std::vector. Как мне перегрузить оператор[], что бы можно было работать по индексам с элементами данной структуры?
Код структуры:
struct matchBlobs {
std::vector<cv::Point> leftBlob;
std::vector<cv::Point> rightBlob;
std::vector<int> colorPoints;
matchBlobs() {};
matchBlobs(cv::Point ptLeft, cv::Point ptRight) {
leftBlob.push_back(ptLeft);
rightBlob.push_back(ptRight);
}
matchBlobs(cv::Point ptLeft, cv::Point ptRight, int color) {
leftBlob.push_back(ptLeft);
rightBlob.push_back(ptRight);
colorPoints.push_back(color);
}
void push_back(cv::Point ptLeft, cv::Point ptRight) {
leftBlob.push_back(ptLeft);
rightBlob.push_back(ptRight);
}
void push_back_color(int color) {
colorPoints.push_back(color);
}
int size() const {
return leftBlob.size();
}
};
И то как я планирую использовать []
matchBlobs outputMatchBlobs, tempMatchBlobs;
....
for (int i = 0; i < n; ++i) {
outputMatchBlobs[(i + n - k) % n] = tempMatchBlobs[i];
}
Ответы (2 шт):
Автор решения: Chorkov
→ Ссылка
Если доступ к отдельным элементам "записи" то можно воспользоваться кортежем из ссылок:
auto operator[]( size_t i ) { return std::tie( leftBlob[i], rightBlob[i], colorPoints[i] ); }
auto operator[]( size_t i ) const { return std::make_tuple( leftBlob[i], rightBlob[i], colorPoints[i] ); }
Если доступ к элементам данных - нужен, то попробуйте поменять способ хранения:
struct value_type { cv::Point leftBlob, rightBlob; int colorPoint; };
std::vector< value_type > data;
Автор решения: AR Hovsepyan
→ Ссылка
Если подразумевается, что вектора могут хранить разное количество cv::Point, то стоит хранить структуру указателей. Кроме того, нужно стараться не повторять и сокращать код. Первоначально это может выглядеть следующим образом:
struct matchBlobs {
using P = cv::Point;
struct Points {
P* leftBlob = nullptr;
P* rightBlob = nullptr;
int colorPoints{};
~Points() {
delete leftBlob;
delete rightBlob;
}
//copy, = ...
};
std::vector<Points> Blob;
//при создании лучше резервировать какое то количество памяти
explicit matchBlobs(size_t size = 10) { Blob.reserve(size); };
matchBlobs(P ptLeft, P ptRight, int color = 0) {
push_back(ptLeft, ptRight, color );
}
void push_back(P ptLeft, P ptRight, int color = 0) {
Blob.push_back({ new P(ptLeft), new P(ptRight), color });
}
void push_back_color(int color) {
Blob.push_back({ nullptr, nullptr, color });
}
int size() const {
//количество не нулевых указателей на левый шарик
return std::count_if(Blob.begin(), Blob.end(),
[](P p) { return p; });
}
Points& operator[](const size_t index)
{
return Blob[index % Blob.size()];
}};
каждый элемент может иметь или не иметь левый или правый blob