Как изменить элементы указателя на вектор? - PullRequest
0 голосов
/ 14 декабря 2018

Допустим, у меня есть пара векторов целых чисел и указатель на вектор целых чисел.Как бы я изменил значение одного элемента указателя на адрес в одном из других векторов целых чисел?

В этом контексте я создал класс, который позволяет мне вводитьмой рабочий стол в нереальный движок, однако на каждом тике он должен назначать форму вектора, которая содержит структуру для значений другого класса данных каждый тик, вместо этого я хочу скопировать адреса памяти только для нескольких элементов (значения цвета в пикселях), поэтому я не теряю времени, делая копию дважды (для рабочего стола это миллионы операций)

#include <iostream>
#include <vector>

using namespace std;

// Print function
void PrintVector(vector<int> v)
{
 for( int i = 0; i < v.size(); i++ )
 {
 cout << v[i] << ", ";
 }
 cout << endl;
}

int main()
{

    vector<int> vector1;
    vector<int> vector2;
    vector<int> *ptrvector;

    //Do some assignment so the vectors have values
    for( int i = 0; i<3; i++)
    {
        vector1.push_back(i);
        vector2.push_back(2*i);
    }
    //Assign the pointer to the address of vector1.
    ptrvector = &vector1;

    //Print out:
    PrintVector(vector1);  // (1,2,3)
    PrintVector(vector2);  // (2,4,6)
    PrintVector(*ptrvector); // (1,2,3)
    // We should see that lines 1 and 3 are the same

    //BROKEN BIT::

    //Ideally want something like
    ptrvector[0] = &vector2[2];
    PrintVector(*ptrvector); // (6,2,3);

    //Such that if I were to do this:
    vector2[2] = 20;
    PrintVector(*ptrvector); // It should change as a side effect: (20,2,3)


}

БОНУСНЫЙ ВОПРОС:

Допустим,У меня есть это:

TArray<FColor> ColorData;
TArray<FColor> *ptrColorData
//Where TArray is essentially a vector. FColor is a struct with members (R,G,B,A)

//ColorData is initialised somewhere and we set the ptrColorData to the address
ptrColorData = &ColorData;

//Somewhere down the line we have a long loop whereby we do
ColorData[i].B = somedata[i];
ColorData[i].G = somedata[i+1];
ColorData[i].R = somedata[i+3];

//somedata is updated per tick, asigning ColorData per tick as well slows it down.
// I wish to be able to do something on the lines of this

ptrColorData[i].B = &somedata[i];
ptrColorData[i].G = &somedata[i+1];
ptrColorData[i].R = &somedata[i+3];

// this is only called once to initialize. Because the memory address
//is unchanging and somedata changes by functions on its own it means when
// I tell my unreal engine to update a texture by passing (*ptrColorData)
// to a function it automatically has the new data when that function is
// next called.

1 Ответ

0 голосов
/ 14 декабря 2018

Это должно дать желаемый результат, но имейте в виду.Как указано в комментариях, адреса, хранящиеся в std::vector<int*>, следует считать недействительными, если вы каким-либо образом измените размер vector1 или vector2 и если вы переупорядочите элементы в исходных векторах, ваши указатели будут указывать нанеправильные значения.Я также удалил using namespace std;.См .: Почему «использование пространства имен std» считается плохой практикой? .

#include <iostream>
#include <vector>

// Print function
void PrintVector(std::vector<int> v) {
    for(auto x : v) std::cout << x << ", ";
    std::cout << "\n";
}

void PrintVector(std::vector<int*> v) {
    for(auto x : v) std::cout << *x << ", ";
    std::cout << "\n";
}

int main() {
    std::vector<int> vector1;
    std::vector<int> vector2;
    std::vector<int*> ptrvector; // pointers to the elements in vector1/2

    //Do some assignment so the vectors have values
    for( int i = 1; i<=3; i++) {
        vector1.push_back(i);
        vector2.push_back(2*i);
    }
    // Add pointers in ptrvector to the addresses in vector1.
    ptrvector.reserve(vector1.size());
    for(auto& r : vector1)
        ptrvector.emplace_back(&r);

    //Print out:
    PrintVector(vector1);   // (1,2,3)
    PrintVector(vector2);   // (2,4,6)
    PrintVector(ptrvector); // (1,2,3)

    ptrvector[0] = &vector2[2];
    PrintVector(ptrvector); // (6,2,3);

    vector2[2] = 20;
    PrintVector(ptrvector); // (20,2,3)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...