2014-01-24 2 views
-2

Я вектор структуры и его компонентов, теперь я хочу массив этой группы, ниже мой кодмассив вектора <struct> в C++

struct V1 
{ 
USHORT val; 
UINT cnt; 
USHORT state; 
}; 

struct V2 
{ 
DWORD room; 
vector <V1> vref; 
bool update_V1(USHORT S1, USHORT S2); 
VOID ClearState(USHORT S1); 

}; 
struct V3 
{ 
USHORT block; 
vector <V2> V2ref; 
bool Update_V2(DWORD S1,USHORT S2,USHORT S3); 
VOID ClearState_V2(USHORT S4); 
}; 
struct V4 
{ 
USHORT space; 
vector <V3> V3ref; 
bool Update_V3(USHORT S1,DWORD S2,USHORT S3); 
VOID ClearState_V2(USHORT S4); 

}; 
struct V5 
{ 
USHORT del_1; 
vector <V4> V4ref; 
bool Update_V4(USHORT S1,USHORT S2,DWORD S3,USHORT S4); 
VOID ClearState_V2(USHORT S4); 
}; 

class C1 
{ 
vector<V5> V5ref[2]; 
bool UpdateGroup(USHORT S1,USHORT S2,USHORT S3,DWORD S4,USHORT S5); 

} 

bool C1::UpdateGroup(USHORT S1,USHORT S2,USHORT S3,DWORD S4,USHORT S5) 
{ 
    vector<V5>::iterator it; 
for (it=V5ref[S5].begin() ; it< V5ref[S5].end(); it++) 
{ 
    if(it->del_1==S2) 
    { 
     return grpItr->Update_V4(S1,S2,S3,s4); 
    } 
} 
V5 V5local; 
V5local.del_1 = S2; 
V5local.Update_V4(S1,S2,S3,S4); 
V5ref[S5].push_back(V5local); 
return true; 
} 

Я попытался с помощью вектора V5ref [2]; Он работает для 1-й итерации и выдает ошибку «assert» для 2-й итерации, что может быть причиной. есть ли другой вариант иметь копии векторов.

Что именно я хочу сделать, так как параметр S2 равен 1, 2, 3, я хочу, чтобы различные массивы всего вектора для S2 = 1, S2 = 2 ... V5, а его компоненты должны быть отдельными элементами массив в соответствии с S2

+1

Мы не можем знать, что вы там делаете ... Вы сказали 'Я попытался с помощью вектора V5ref [2]', но там нет 'V5ref' vector. Также вы должны написать больше своего кода, а не только заголовочный файл. – Victor

+2

Note * больше * код, но * соответствующий * код. – juanchopanza

ответ

2

Я немного исследовал вашу проблему. Поскольку кода недостаточно, мы все можем только догадываться, что вы делаете или не делаете. Утверждение об отладке обычно возникает, если вектору недостаточно места. (исправьте меня, если я ошибаюсь). Итак, в этом случае, прежде чем использовать ваши векторы, вы должны использовать метод resize();. Вот пример:

struct structure 
{ 
    int value1; 
    char value2; 
    bool value3; 
}; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    std::vector<structure> vector1; 
    vector1.resize(1); 

    vector1[0].value1 = 12; 
    vector1[0].value2 = 'h'; 
    vector1[0].value3 = true; 

    return 0; 
} 

Если вы проверить это самостоятельно, вы будете знать, что без vector.resize(1); это не будет работать на время выполнения.

+0

Я думаю, что это может быть плохое введение в использование вектора и, как правило, предлагает вам лучше всего использовать std :: array – kfsone

+0

Это действительно не идеальный код, поскольку OP должен инициализировать каким-то образом, но мне нужно еще немного чтобы выяснить, что он хочет. – Victor

0

В любой момент времени, std::vector<> имеет ограничение, size которое максимальное количество элементов вы можете получить доступ к + 1, а также ограничению capacity которое, сколько элементов он может содержать, прежде чем он должен переместить данные на больший выделение памяти.

size определяет, к чему вы можете получить доступ. Когда вектор создан, вы ничего не можете получить. vec[0] является незаконным, когда вектор пуст.

#include <vector> 
#include <iostream> 

int main() 
{ 
    std::vector<int> vec; 

    std::cout << "initially, vec.size = " << vec.size() << ", cap = " << vec.capacity() << "\n"; 

    // initially, the vector is empty. 

    // std::cout << vec[0] << '\n'; // undefined behavior, probably a crash 
    // you can only ever access vec[n] where v < vec.size(), 
    // this vector is empty, so size() == 0 

    // Lets add a number to the vector. 
    vec.push_back(5); 
    std::cout << "now, vec.size = " << vec.size() << ", cap = " << vec.capacity()   

    std::cout << "vec[0] = " << vec[0] << '\n'; 
    // std::cout << vec[1] << '\n'; // undefined behavior because 1 >= size() 

    vec.resize(5); 
    std::cout << "resized, vec.size = " << vec.size() << ", cap = " << vec.capacity()   

    vec[1] = 1; // valid, resize made space for vec[0] .. vec[4] 
    vec[2] = 2; 

    for (auto it = vec.begin(), end = vec.end(); it != end; ++it) 
     std::cout << *it << '\n'; 

    return 0; 
} 

push_back делает "vec.resize (vec.size() + 1)" для вас, а затем вставляет значение будучи «push_back'ed в новый слот.

resize пытается освободить место для дополнительных элементов - если размер 3 и вы говорите resize(5), он попытается освободить место для 2 новых элементов.

Если результат приводит к тому, что size превышает capacity, тогда вектор выделяет новый массив, копирует в него старые данные и освобождает старый массив. Это может стать очень дорогостоящим. Если вы знаете как велик ваш вектор собирается стать, вы можете избежать этого перемещения по телефону reserve()

#include <iostream> 
#include <vector> 

using std::cout; 

struct Stud // will always tell you when it reproduces 
{ 
    int m_i; 
    Stud() : m_i(-1) {} 
    Stud(int i) : m_i(i) {} 
    Stud(const Stud& rhs) : m_i(rhs.m_i) { cout << "Copying(Ctor) " << m_i << '\n'; } 
    Stud& operator=(const Stud& rhs) { m_i = rhs.m_i; cout << "Copying(=) " << m_i << '\n'; return *this; } 
}; 

int main() 
{ 
    std::vector<Stud> studs; 

    studs.push_back(0); 
    studs.push_back(1); 

    studs.reserve(5); 

    studs.push_back(5); // remember, this adds to the back. 
    studs.push_back(6); 

    std::cout << "size of studs " << studs.size(); 

    return 0; 
} 

На основе этого

bool Update_V4(USHORT S1,USHORT S2,DWORD S3,USHORT S4); 

Я предполагаю, что вы пытаетесь имитировать многомерный массивы какой-то, и вы делаете что-то вроде

V4Ref[S1] 

без проверки

if (S1 < V4Ref.size()) 

C++ имеет функцию 'assert', которая приведет к завершению приложения Debug build, если условие не выполнено.

#include <cassert> 
#include <vector> 

int main() 
{ 
    std::vector<int> vec; 
    assert(vec.size() == 0); 
    vec.push_back(1); 
    vec.resize(5); 
    vec.push_back(5); 
    assert(vec.size() == 10); // expect to crash here. 

    return 0; 
} 

Вы можете использовать это, чтобы помочь поймать плохих размеров:

bool V4::Update_V4(USHORT S1,USHORT S2,DWORD S3,USHORT S4) 
{ 
    assert(S1 < V4ref.size()); 
    return V4ref[S1].Update_V3(S2, S3, S4); 
} 
Смежные вопросы