2013-08-02 4 views
-4

всеКак использовать итератор для итерации 2D-вектора?

Я использую вектор в C++ STL для хранения моих данных. Я передаю и возвращаю их в функции. Однако по мере роста размера данных программа работает медленнее и медленнее. Таким образом, я обновляю коды до «версии итератора».

Что я хочу архивировать, так это то, что используют итераторы для передачи, возврата и повторения векторов STL.

Теперь я согласен с операциями с 1-мерным вектором, точно так же, как манипулирование массивами. Однако, когда дело доходит до двумерного вектора, я немного смущен.

Может ли кто-нибудь показать мне простой пример кода, как итерация 2D-вектора с использованием STL-итератора?

Большое спасибо заранее.

С уважением

Long

+0

Не забывайте, что вы можете передавать вещи const ref, чтобы избежать копирования. Можете ли вы разместить образец кода 2D-вектора. Это вектор >? – doctorlove

+0

-1, ваш вопрос запрашивает образец кода; образец кода для проблемы уже доступен в stackoverflow – dans3itz

+0

@doctorlove Большое спасибо за ваши ответы. Теперь я выясню вопрос и верну его. Однако возникает еще один вопрос: как получить размер вектора, используя его итератор? – ChangeMyName

ответ

1

Ну его уже где-то на StackOverflow

Но если вы не хотите искать здесь:

std::vector<std::vector<int> > vec{ {1,2,3},{4,5,6}}; 

//Simplest Way:- (C++11) 

for(auto row:vec) 
{ 
    for(auto col:row) 
    std::cout<<col<< " "; 
    std::cout<<std::endl; 
} 

//OR Using iterator 
std::vector<std::vector<int> >::iterator r; 
std::vector<int>::iterator c; 
for (r = vec.begin(); r != vec.end(); r++) { 
    for (c = r->begin(); c != r->end(); c++) { 
     std::cout<<*c<< " "; 
    } 
    std::cout<<std::endl; 
} 

Можно получить distance только между двумя итераторы того же контейнера

std::vector<int>::iterator s = v2.begin(); //Can be any start 
std::vector<int>::iterator e = v2.end(); // Can be any end 

std::cout<<"Distance :"<<std::distance(s,e)<<std::endl; 
+0

Привет, P0W. Я сделал итерацию 2D-вектора по-другому: 'vector > :: iterator iter; iter = vec.begin(); for (int i = 0; i <3; i ++) {for (int j = 0; j <4; j ++) cout << iter [i] [j] << ''; соиЬ << епсИ; } 'Извините за беспорядок, я новичок в этом форуме и ничего не знаю о формате. – ChangeMyName

+0

@ user2633803 не жуйте код 3 и 4. Используйте итераторы – doctorlove

+0

@doctorlove Я проверил тест, чтобы увидеть разницу в скорости между итератором и индексом. Оказалось, что итератор неконкурентоспособен. – ChangeMyName

1

Вы заявляете, что ваша основная проблема - это производительность, не так ли? Вы предполагаете, что это вызвано копированием. Возможно, может быть более простыми решениями для вашей проблемы:

  • Проверьте векторы могут быть переданы через (сопзИте) эталонный
  • Проверьте, если shared_ptr имеет смысл
  • Рассмотрит, если двигаться семантика может помочь
  • Пожалуй компилятора версия или реализация предотвращают оптимизацию возвращаемого значения
1

Если вы необходимо знать размер вектора, и есть два итератора it1it2,

std::distance(it1, it2); 

расскажет вам расстояние между ними. Это случается размер, если они begin и end

Если у вас есть функция, как

int work(std::vector<int> items) 
{ 
    //... 
} 

это копии векторные элементы, поэтому будет использовать больше оперативной памяти и занимает больше времени. Отправка const ref вместо этого не будет копировать вектор. Сделать это const останавливает вас, изменяя его, что может вам не помочь, но вы не разместили какой-либо код, поэтому я не знаю, что вы хотите сделать.

int work(const std::vector<int> & items) 
{ 
    //... 
} 
Смежные вопросы