c ++ создает субвектор, работающий с теми же данными - PullRequest
6 голосов
/ 18 марта 2020

Здравствуйте, у меня есть вектор:

vector<int> myCuteVector {1,2,3,4};

Теперь я хотел бы создать подвектор таким образом, чтобы он содержал 2 первых элемента из myCuteVector таким образом, чтобы после изменения элементов подвекторов, изменились бы и элементы myCuteVector.

Псевдокод:

vector<int> myCuteVector {1,2,3,4};
vector<int> myCuteSubVector = myCuteVector[0:2];
myCuteSubVector[0] = 5;
printf("%d", myCuteVector[0]) //would print also 5;

возможно ли достичь?

Ответы [ 3 ]

7 голосов
/ 18 марта 2020

Вы можете сделать это с помощью std::reference_wrapper. Это будет выглядеть так:

int main()
{
    std::vector<int> myCuteVector {1,2,3,4};
    std::vector<std::reference_wrapper<int>> myCuteSubVector{myCuteVector.begin(), myCuteVector.begin() + 2};
    myCuteSubVector[0].get() = 5; // use get() to get a reference
    printf("%d", myCuteVector[0]); //will print 5;
}

Или вы можете просто использовать итераторы, например

int main()
{
    std::vector<int> myCuteVector {1,2,3,4};
    std::vector<std::vector<int>::iterator> myCuteSubVector{myCuteVector.begin(), myCuteVector.begin() + 1};
    // it is important to note that in the constructor above we are building a list of
    // iterators, not using the range constructor like the first example
    *myCuteSubVector[0] = 5; // use * to get a reference
    printf("%d", myCuteVector[0]); //will print 5;
}
5 голосов
/ 18 марта 2020

Начиная с C ++ 20 , вы можете использовать std::span:

std::vector<int> myCuteVector {1,2,3,4};
std::span<int> myCuteSubVector(myCuteVector.begin(), 2);
myCuteSubVector[0] = 5;
std::cout << myCuteVector[0];  // prints out 5

Демонстрационная версия: https://wandbox.org/permlink/4lkxHLQO7lCq01eC.

1 голос
/ 18 марта 2020

Вы можете использовать указатели: -

vector<int> myCuteVector = {1,2,3,4};
vector<int*> myCuteSubVector;
for(int i = startPos; i < endPos; ++i)
    myCuteSubVector.emplace_back(&myCuteVector[i]);    //or you can use push_back()

Где startPos и ​​endPos (исключая) указывает индексы из исходного массива, которые вы хотите изменить ...

Затем, чтобы изменить значение в позиции 'j' (которое должно быть между [startPos, endPos)) относительно исходного массива: -

*myCuteSubVector[j - startPos] = 123;

Конечно, в вашем конкретном случае c вы можете просто написать как это: -

vector<int> myCuteVector = {1,2,3,4};
vector<int*> myCuteSubVector = {&myCuteVector[0], &myCuteVector[1]};
*myCuteSubVector[0] = 5;

Не знаю, почему вы хотите это сделать ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...