假设我们在std::vector<double>
中有一组双精度数。让我们称它为data
。现在我想创建一个新的std::vector,它通过一个方法subvector
由data
的一个(已排序的)子集组成,例如,让data = [0,4,3,5,5,7]
和我想要给我的方法
std::vector<int> indices(3);
indices[0] = 1;
indices[1] = 2;
indices[2] = 4;
std::vector<double> subdata = data.subvector(indices);
结果应该是subdata = [4,3,5]
。当然,我可以通过简单地复制data
的值来实现这一点,但我真正想要的是,如果我在subdata
中更改了值,它们在data
中也会更改,也就是说,如果我这样做,subdata[2]=-1
就是想要那个data = [0,4,3,5,-1,7]
。
所以,我必须做一些事情,比如“记住”data
中的指针。我尝试了几个选项,将&
和*
放在这里和那里,但是我不能得到想要的结果。
发布于 2018-09-13 22:36:00
存储指向项目的指针有点危险,因为在追加项目时,向量的内部缓冲区可能会(自动)被替换,然后这些指针就会悬空。
但您可以存储指向向量本身的指针或引用,如下所示:
#include <vector>
#include <initializer_list>
using namespace std;
class Subdata
{
vector<int>& m_data;
const vector<int> m_indices;
public:
auto operator[]( const int i )
-> int&
{ return m_data[m_indices[i]]; }
Subdata( vector<int>& data, const initializer_list<int>& indices ):
m_data( data ),
m_indices( indices.begin(), indices.end() )
{}
};
#include <iostream>
auto main()
-> int
{
vector<int> data = {0, 4, 3, 5, 5, 7};
Subdata subdata( data, {1, 2, 4} );
subdata[2] = -1;
for( const int v : data ) { cout << v << ' '; } cout << endl;
}
发布于 2018-09-13 21:57:26
我真正想要的是,如果我更改子数据中的值,它们也会改变数据中的值,也就是说,如果我真的想要那个
data = [0,4,3,5,-1,7]
,那么它们也会改变。
为此,您需要将指向成员的指针存储在data
中。它们可以是原始指针(int*
)或迭代器(std::vector<int>::iterator
)。
然而,存储指针是有风险的。它们可以通过修改data
来使其失效。更安全的方法是只使用索引,并通过使用索引来获取/设置data
元素的值。
data[indices[0]] = <some value>; // Set the value in data
int x = data[indices[1]]; // Get the value from data
由于std::vector
是一个随机访问容器,因此访问data
元素的成本不会影响性能,如果需要考虑的话。
https://stackoverflow.com/questions/52322268
复制相似问题