2012-04-28 2 views
0

это код, я бегу:печать содержимое 2d вектора

std::vector<std::vector<double>> test; 
test.push_back(std::vector<double>(30)); 

std::vector<std::vector<double> >::iterator it=test.begin(), end=test.end(); 
    while (it!=end) { 
     std::vector<double>::iterator it1=it->first.begin(),end1=it->first.end(); 
     while (it1!=end1) { 
    std::copy(it1.begin(),it1.end(),std::ostream_iterator<double>(std::cout, " ")); 
    ++it1; 
     } 
     ++it; 
    } 

это ошибка компиляции я получаю:

data.cpp:33:45: error: ‘class std::vector<double>’ has no member named ‘first’ 
data.cpp:33:68: error: ‘class std::vector<double>’ has no member named ‘first’ 
data.cpp:35:16: error: ‘class std::vector<double>::iterator’ has no member named ‘begin’ 
data.cpp:35:28: error: ‘class std::vector<double>::iterator’ has no member named ‘end’ 
data.cpp:35:34: error: ‘ostream_iterator’ is not a member of ‘std’ 
data.cpp:35:56: error: expected primary-expression before ‘double' 

какие-либо предложения о том, как это исправить, так что я могу напечатать содержание теста

+1

Незначительное предложение: поскольку вы не изменяете свой 2D-вектор через итераторы, а просто читаете его элементы, используйте 'std :: vector :: const_iterator' –

+0

@BojanKomazec, спасибо за предложение. Я сделаю исправление – user1155299

ответ

2

Я думаю, что это больше того, чего вы хотите.

std::vector<std::vector<double>> test; 
// Put some actual data into the test vector of vectors 
for(int i = 0; i < 5; ++i) 
{ 
    std::vector<double> random_stuff; 
    for(int j = 0; j < 1 + i; ++j) 
    { 
     random_stuff.push_back(static_cast<double>(rand())/RAND_MAX); 
    } 
    test.push_back(random_stuff); 
} 

std::vector<std::vector<double> >::iterator it=test.begin(), end=test.end(); 
while (it!=end) 
{ 
    std::vector<double>::iterator it1=it->begin(),end1=it->end(); 
    std::copy(it1,end1,std::ostream_iterator<double>(std::cout, " ")); 
    std::cout << std::endl; 
    ++it; 
} 

Вы не хотите, потому что ваш первый вектор не содержит пары, и вам не нужно цикла на основе it1 и end1, потому что они обозначают диапазон вы передаете скопировать.

2

Существуют две проблемы с кодом.

Первыйstd::vectors не содержат std::pairs, поэтому нет first или second:

while (it!=end) { 
    std::vector<double>::iterator it1=it->begin(),end1=it->end(); 

Второй вызов std::copy занимает диапазон, который должен, вероятно, соответствует одному из ваших внутренних векторов. Таким образом, вы переходите на один уровень слишком глубоко.

Вы можете выполнить итерацию по внешнему вектору test, а затем распечатать с использованием copy для каждого из своих элементов (который является вектором).

std::vector<std::vector<double>> test; 
test.push_back(std::vector<double>(30)); 
std::vector<std::vector<double> >::iterator it=test.begin(), end=test.end(); 
for (it!= end, ++it) { 
    std::copy(it1-begin(),it->end(),std::ostream_iterator<double>(std::cout, " ")); 
} 
+0

спасибо за рассуждения. по какой-то причине цикл for создает ошибку компиляции и меняет ее на время работы. – user1155299

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