c ++创建对相同数据进行操作的子向量
Posted
技术标签:
【中文标题】c ++创建对相同数据进行操作的子向量【英文标题】:c++ creating subvector operating on same data 【发布时间】:2020-03-18 13:14:03 【问题描述】:你好,我有一个向量:
vector<int> myCuteVector 1,2,3,4;
现在我想以这样的方式创建一个子向量,它将包含来自 myCuteVector 的 2 个第一个元素,这样在修改子向量元素后,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;
有可能实现吗?
【问题讨论】:
【参考方案1】:您可以使用std::reference_wrapper
来完成此操作。看起来像:
int main()
std::vector<int> myCuteVector 1,2,3,4;
std::vector<std::reference_wrapper<int>> myCuteSubVectormyCuteVector.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> myCuteSubVectormyCuteVector.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;
【讨论】:
感谢您的回答:D 我想知道我是否能够在这些方法中没有额外变量的情况下提取子向量的大小。有可能吗? @JakubBalicki 不太清楚你的意思,但myCuteSubVector.size()
会给你子向量的大小。
@JakubBalicki 确实,如果你正在实现排序算法,你不想做任何这些。您想要的是使用迭代器范围(基本上是指针)或通过引用传递主向量,然后传递子向量的开始和结束索引。这样做会增加一堆内存分配和额外数据,这会影响性能。
@JakubBalicki Works just fine here
@JakubBalicki 使用 span 可以很好地替代迭代器范围。我不建议这样做的唯一原因是因为 C++20 还没有正式问世,所以支持仍然有限。此代码将与符合 C++11 的编译器一起使用,因此它“更便携”(无需升级系统即可在更多系统上使用它)。如果您可以使用span
,您应该尝试一下。【参考方案2】:
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。
【讨论】:
但我刚刚在这里看到link 它从不分配也不释放任何东西。学到了新东西,谢谢...【参考方案3】:你可以使用指针:-
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(exclusive) 指定要更改的原始数组中的索引...
然后,改变位置'j'(应该在[startPos,endPos)之间)相对于原始数组的值:-
*myCuteSubVector[j - startPos] = 123;
当然,在您非常具体的情况下,您可以简单地这样写:-
vector<int> myCuteVector = 1,2,3,4;
vector<int*> myCuteSubVector = &myCuteVector[0], &myCuteVector[1];
*myCuteSubVector[0] = 5;
不知道你为什么要这样做......
【讨论】:
我正在尝试以多种不同的方式在 cpp 中实现合并和快速排序。所以现在我在搞乱向量:D感谢你的想法^^以上是关于c ++创建对相同数据进行操作的子向量的主要内容,如果未能解决你的问题,请参考以下文章