创建一个引用另一个向量的一些元素的向量

时间:2010-05-15 06:22:52

标签: c++ stl

我已将class A的实例存储在std:vector中,vec_A存储为vec_A.push_back(A(i))。代码如下所示。

现在,我想将class A(在vec_A)中的一些实例存储在另一个向量或另一个数组中。例如,如果A.getNumber()返回4,7,2,我想将 指针 存储到另一个向量中的A实例,请说{{1或者数组。

有人可以播种我怎么做?谢谢!

std:vector<A*> filtered_A

3 个答案:

答案 0 :(得分:1)

我认为最安全的做法是将第二个向量保存到第一个向量中:

using std::vector;
vector<A> main;
vector<vector<A>::size_type> secondary;

main.push_back(...);
secondary.push_back(main.size() - 1);   // add the index of the last item

现在,要查找项目,您可以使用辅助中的值并使用它来索引到main:

main[secondary[...]];

我之所以推荐这个而不是只是让二级存储直接指针的原因是每次添加到向量时它可能需要调整向量的大小,这可能使任何现有指针无效:

using std::vector;
vector<A> vec;
vec.push_back(A());

// get a pointer to the item you just added
A *p0 = &vec[0];

// add another item
a.push_back(A());

// because a push_back() can cause the vector to resize, p0 may no
// longer point to valid memory and cannot safely be dereferenced

答案 1 :(得分:0)

您无法在STL容器中存储引用,因此您必须使用指针:

std::vector<boost::shared_ptr<A> > v1, v2;
boost::shared_ptr<A> p(new A(i));
v1.push_back(p);
v2.push_back(v1.at(0));

答案 2 :(得分:0)

int main(){ 
    std::vector<A *> vec_A;
    std::vector<A *> vec_filtered_A;
    // build the first vector : 0..4 repeated once
    for (int i = 0; i < 10; i++){
        vec_A.push_back(new A(i%5));
        }
    // build a vector containing all pointers to objects A where value == 2
    int target = 2;
    for (int i = 0; i < 10; i++){
        if (vec_A[i].getNumber() == 2) {
            // this time it copies pointers
            vec_filtered_A.push_back(vec_A[i]);
            }
        }
    // at this point we have two elements in vec_filtered_A : 
    // vec_filtered_A[0] == vec_A[2]
    // vec_filtered_A[1] == vec_A[7]

    // clean up
    while (~vec_A.empty()) {
        delete vec_A.back();
        vec_A.pop_back();
        }

    return 0;
}