2015-02-07 2 views
2

Есть ли все-таки сделать это? В настоящее время я использую вот так:Как назначить значения в 2D-вектор, как 2D-массив

for(i=0;i<PU_number;i++) 
{ 
    for(j=0;j<=time_slots;j++) 
     myMatrix.tempVec.push_back(0.0); 
    myMatrix.value.push_back(myMatrix.tempVec); 
    myMatrix.tempVec.clear(); 
} 

Однако, это не полезно для меня. Иногда мне нужно изменить конкретный адрес в этом векторе. подобный myMatrix.tempVec[1][4]. Когда я делаю это так:

myMatrix.value[i][j]=value; 

портит память, я получаю SIGABRT, SIGSESV и много вещей, как они. Кроме того, valgrind становится сумасшедшим, когда я это делаю. Но мне нужен подходящий способ сделать это.

EDIT: Я сделал то, что вы, ребята сказали:

myMatrix.value.resize(PU_number); 
for(i=0;i<PU_number;i++) 
    myMatrix.value[i].resize(time_slots); 

, а затем:

for(i=0;i<PU_number;i++) 
{ 
    for(j=0;j<time_slots;j++) 
    { 
     for(k=0;k<number_of_packets;k++) 
     { 
      double r=((double) rand()/(RAND_MAX)); 
       for(x=myMatrix.mat[i][k];x<=myMatrix.mat[i][k]+myMatrix.len[i][k];x++) 
       myMatrix.value[i][x]=r; 

     } 
    } 
} 

И я получил "Invalid запись размером 8" снова в Valgrind.

+0

Реквизиты для использования valgrind. Начните с определения того, что он идентифицирует. – WhozCraig

+0

@WhozCraig Он просто не принимает метод, который я сказал выше. Он говорит «недействительная запись размера 8» много раз. –

+0

@Whcrs Ваш _'for (x = myMatrix.mat [i] [k]; x <= myMatrix.mat [i] [k] + myMatrix.len [i] [k]; x ++) '_ loop doesn ' Для меня это очень важно. –

ответ

2

Функция std::vector::resize(), которая может быть использована для правильной установки размеров матрицы , прежде чем вы получите доступ к любым значениям путем индексирования.

Вот небольшой пример

myMatrix.resize(PU_number); 
for(i=0;i<PU_number;i++) { 
    myMatrix[i].resize(time_slots); 
    for(j=0;j<=time_slots;j++) 
     myMatrix[i][j] = 0.0; 
} 
+0

Позволяет ли мне присваивать значения как 2D-массив? –

+0

@Whcrs Позволяет задавать размер векторов заранее. Прочтите связанную справочную документацию. –

+0

Я это знаю. И я сделал это сейчас. Валгринд снова сошел с ума. –

1

Вы можете использовать зЬй :: вектор> как здесь:

#include <vector> 
#include <iostream> 
int main() 
{ 
    std::vector<std::vector<int> > vec; 
    vec.resize(10); 
    for (unsigned int i = 0 ; i < vec.size(); ++i) 
    { 
     vec[i].resize(10); 
    } 
    vec[1][4] = 3; 
    vec[1].push_back(5) 
    std::cout << "vec[1][4] = " << vec[1][4] << std::endl; 
    std::cout << "vec[1][10] = " << vec[1][10] << std::endl; 
    return (0); 
} 

я создаю вектор размера 10, которые содержат другие вектор размера 10; Обратите внимание, что вы должны использовать размер, чтобы получить размер с помощью std :: vector>, но после этого, если вы хотите добавить размер, вы можете использовать vec [i] .push_back (5);

+0

' vec [1] [10] 'выходит за пределы. –

+0

нет, потому что push_bask добавит 1. Я попробовал это, потому что ответ - это работа –

Смежные вопросы