2013-06-21 4 views
0

Я пытаюсь перебирать мой векторный массив, но я не могу заставить его работать, моя ошибка на второй цикл, и сообщение об ошибке является продолжение:итерации через массив вектора в C++

ожидается первичное выражением перед «двойными»

Я просмотрел о том, как итерации регулярного вектора, но как итератор векторного массива? Я следовал этой структуры:

#include <iostream> 
#include <vector> 

int main() 
{ 
    std::vector<int> myvector; 
    for (int i=1; i<=5; i++) myvector.push_back(i); 

    std::cout << "myvector contains:"; 
    for (std::vector<int>::iterator it = myvector.begin() ; it != myvector.end(); ++it) 
    std::cout << ' ' << *it; 
    std::cout << '\n'; 

    return 0; 
} 

Я не могу показаться, чтобы получить мой векторный вариант массива работать.

#include <iostream> 
#include <fstream> 
#include <vector> 
using namespace std; 

int main(int arc, char *argv[]) 
{ 
    vector<double> vector[7]; 

    double num[7]; 
    ifstream infile("data.txt"); 
    string temp; 

    for(int i = 0; i <= 6; i++) 
    { 
     infile >> temp; 
     cout << temp << ' '; 
    } 
    cout << endl; 

    while(infile >> num[0] >> num[1] >> num[2] >> num[3] >> num[4] >> num[5] >> num[6]) 
    { 
     for(int i = 0; i <= 6; i++) 
     { 
     vector[i].push_back(num[i]); 
     } 
    } 
    cout << endl; 

    for(int i = 0; i <= 6; i++) 
    { 
     // error on this line 
     // not sure what is wrong before vector<double>:: iterator it = vector[i].begin() 
     for(vector<double>::iterator it = vector[i].begin(); it != vector[i].end(); ++it) 
     { 
     cout << ' ' << *it; 
     } 
    } 
    return 0; 
} 
+1

'vector my_vector [7];' Попытайтесь избежать использования пространства имен std', чтобы это не происходило. – perreal

+5

Вызов векторной переменной «вектор» - это * не * хорошая идея. Дайте ему имя, которое не будет принято, и проблема исчезнет. – Beta

+0

Также для каждого вектора вы отбрасываете только одно число, это то, что вы действительно хотите? т. е. 7 векторов для 7 удвоений. – legends2k

ответ

1
#include <iostream> 
#include <fstream> 
#include <vector> 

using std::ifstream; 
using std::vector; 
using std::cout; 

int main(int arc, char *argv[]) 
{ 
    const size_t data_size = 7; 
    ifstream infile("data.txt"); 
    vector<double> input; 
    double num; 
    while ((infile >> num) && (input.size() <= data_size)) 
    { 
     input.push_back(num); 
    } 
    for (vector<double>::iterator it = input.begin(); it != input.end(); ++it) 
    { 
     cout << ' ' << *it; 
    } 
    return 0; 
} 

Используйте минимальные переменные и получить работу один. Также не называйте свои переменные после стандартных функций библиотеки, классов, структур и т. Д. И избегайте using directive s, например using namespace std;, и предпочитайте using declaration s.

+0

Этот код не делает то же самое, что и код OP. – StilesCrisis

+0

* «не называйте переменные после стандартных библиотечных функций, классов, структур» * - Почему? Учитывая, что в стандартной библиотеке используется множество имен (и многие из них являются очень общими), этот совет является чрезвычайно контрпродуктивным. Для чего нужны пространства имен? –

+0

@ChristianRau: Я понимаю, что пространства имен эффективно скрывают эти имена, но чтение затруднено при использовании _exactly_ с тем же именем. Это, пожалуй, причина, по которой мы видим, что пользовательские письменные векторы имеют такие имена, как EAVector и т. Д. С префиксом, который отличается от стандартных контейнеров. Когда это имеет место для четных классов, переменные с тем же именем, что и его класс, еще более запутывают, когда 1000s loc. – legends2k

-1

Вы можете просто пройти вектор массива, как этот for (int i=0; i<myvector.size(); i++) { for (int j=0; j<myvector.size(); j++) { cout<<myvector[i][j]<<endl; } }

2

На этой строке кода

for(vector<double>::iterator it = vector[i].begin(); it != vector[i].end(); ++it) 

vector не тип, это переменная. Имена в локальных областях скрывают имена в глобальных областях.

Вы могли бы вместо того, чтобы написать

for(::std::vector<double>::iterator it = vector[i].begin(); it != vector[i].end(); ++it) 

или

for(auto it = vector[i].begin(); it != vector[i].end(); ++it) 

, но лучшее решение, чтобы не использовать такое же имя для нескольких различных вещей.