2013-06-13 3 views
0

У меня есть некоторая проблема при переводе некоторых строк кода из ANSI C и массивов в C++ с векторами.Операция над итераторами в C++

Для работы итеративного вдоль элемента массива, в ANSI C, я писал:

int i; 
struct Sys{ 
    double *v; 
}; 
Sys sys; sys.v = malloc(10*sizeof(double)); 
//initialize the array with some values... 
{...} 
for (i = 5; i < 10; i++){ //overwrite the cumulative sum starting from position 4 
    sys.v[i] = sys.v[i] + function_that_return_a_double(i); 
} 

Теперь, я не буду переводить на C++ с использованием векторов. Вот мой суд.

Sys { 
    vector<double> v; 
}; 
Sys sys; 
sys.v.resize(10); 
// initialize the vector with some values... 
{...} 
for (vector<double>::iterator it = sys.v.begin() + 5; it != sys.v.end(); ++it){ //yyy 
    k = k+1; 
    tmp = function_that_return_a_double(k); 
    *it = *it + tmp; //xxx 
} 

Но я получаю следующее сообщение об ошибке:

code.cpp:xxx: error: name lookup of ‘it’ changed for ISO ‘for’ scoping 
code.cpp:xxx: note: (if you use ‘-fpermissive’ G++ will accept your code) 

Если я complile с -fpermissive, я получаю:

code.cpp:xxx: warning: name lookup of ‘it’ changed for ISO ‘for’ scoping 
code.cpp:yyy: warning: using obsolete binding at ‘it’ 

Я не undenstand, если это правильный путь использование итераторов и STD: вектор

Надеюсь, вы сможете решить мои сомнения,

Cheers,

Al.

PS: Я исправил объявление v в случае C++. v не является указателем! PPS: фрагмент кода в порядке! Смотри ниже.

+3

Как 'sys.v.begin()' компилировать, когда 'v' является указателем? –

+2

Кроме того, что такое 'Sys { vector * v; }; '? –

+0

На самом деле вы начинаете с позиции 6. – JustSid

ответ

1

Вы должны объявить Sys как структуры или класса:

struct Sys { 
    vector<double> *v; 
}; 

Вы пытаетесь получить доступ к v, как будто это вектор. Используйте ->, потому что это указатель на вектор.

Sys sys; 
sys.v->resize(10); 

for (vector<double>::iterator it = sys.v->begin(); it != sys.v->end(); ++it) { 
    *it += function_that_returns_a_double(k); // Define k somewhere. 
} 
+0

Привет, спасибо за это. По правде говоря, v не является указателем. Я исправил вопрос. k - переменная, которая растет на каждой итерации. – altroware

+1

@altroware Сообщение об ошибке, с которым вы сталкиваетесь, обычно возникает, когда вы обращаетесь к 'it' вне области for-loop. Ваш фрагмент кода в порядке, вы используете его где-нибудь еще? – Garee

+0

Приятно знать, что фрагмент кода в порядке. Фактически там, где отсутствует фигурная скобка в исходном коде. Я выучил урок, спасибо вам большое. – altroware