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 ++创建对相同数据进行操作的子向量的主要内容,如果未能解决你的问题,请参考以下文章

您不具有对数据库的独占访问权限这一次。如果继续进行更改,您可能无法将其保存

C基础笔记一

C基础笔记一

对具有相同单词但顺序不同的字符串进行分组

C语言中内存四区的本质分析

如何从相同的数据构造2列并计算比率?