итератор для 2d вектора

Чтобы добавить к тому, что сказал @lawlist (который должен был связывать ключ в minibuffer-local-map):

Есть несколько мини-буферов мини-буферов, в зависимости от того, что читается в минибуфере, и как. И какой из этих раскладок, которые вы, возможно, захотите использовать, может зависеть от того, какую версию Emacs вы используете.

Кроме того, есть также карта клавиш для взаимодействия с буфером *Completions*: completion-list-mode-map.

Для завершения работы в минибуфере основной раскладкой является minibuffer-local-completion-map.

Вот список мини-буферов. Некоторые из них могут быть недоступны (использованы) в вашей версии Emacs.

  • minibuffer-local-map
  • minibuffer-local-ns-map
  • minibuffer-local-isearch-map
  • minibuffer-local-completion-map
  • minibuffer-local-must-match-map
  • minibuffer-local-filename-completion-map
  • minibuffer-local-filename-must-match-map
  • minibuffer-local-must-match-filename-map

Кроме того, вы можете использовать minibuffer-with-setup-hook (или minibuffer-setup-hook напрямую), чтобы добавить привязки клавиш «на лету», на протяжении одного показания минибуфера.

I добавит эту информацию, так как это может быть очень полезно при манипулировании мини-буферами: вы можете использовать C-h M-k (команда describe-keymap), из библиотеки help-fns+.el , чтобы увидеть все привязки данной мини-буферической клавиатуры в удобочитаемой форме.

21
задан Dima 23 November 2009 в 20:18
поделиться

4 ответа

Хотя ваш вопрос не очень ясен, я предполагаю, что вы имеете в виду двумерный вектор, чтобы означать вектор векторов:

vector< vector<int> > vvi;

Тогда вам нужно использовать два итератора для его обхода, первый - итератор «строк», второй - итераторы «столбцов» в этой «строке»:

//assuming you have a "2D" vector vvi (vector of vector of int's)
vector< vector<int> >::iterator row;
vector<int>::iterator col;
for (row = vvi.begin(); row != vvi.end(); row++) {
    for (col = row->begin(); col != row->end(); col++) {
        // do stuff ...
    }
}
42
ответ дан 29 November 2019 в 06:42
поделиться

Можно использовать автоматическое ключевое слово для таких случаев:

#include <iostream>
#include<bits/stdc++.h>
using namespace std;

int main() {
    // your code goes here
    vector<vector<int>>v;

    for(int i=0;i<5;i++)
    {
        vector<int> x={1,2,3,4,5};
        v.push_back(x);
    }
    cout<<"-------------------------------------------"<<endl;
    cout<<"Print without iterator"<<endl;
    cout<<"-------------------------------------------"<<endl;
    for(int i=0;i<5;i++)
    {
        vector<int> y=v[i];
        for(int j=0;j<y.size();j++)
        {
            cout<<y[j]<<" ";
        }
        cout<<endl;
    }
    cout<<"-------------------------------------------"<<endl;
    cout<<"Print with iterator"<<endl;
    cout<<"-------------------------------------------"<<endl;
    for(auto iterator=v.begin();iterator!=v.end();iterator++)
    {
        vector<int> y=*iterator;
        for(auto itr=y.begin();itr!=y.end();itr++)
        {
            cout<<*itr<<" ";
        }
        cout<<endl;
    }
    return 0;
}
0
ответ дан 29 November 2019 в 06:42
поделиться

Если вы имеете в виду итератор STL и настраиваемый контейнер, который реализует общий 2D-массив объектов, это невозможно. Итераторы STL поддерживают только операции увеличения и уменьшения (например, «следующий» и «предыдущий»), где для перемещения по 2D-набору требуется четыре таких примитива (например, влево / вправо / вверх / вниз и т. Д.). Метафоры не совпадают.

Что вы пытаетесь сделать?

0
ответ дан 29 November 2019 в 06:42
поделиться

Предполагая, что вы имеете в виду вектор векторов, и у вас есть std :: vector , встроенного способа сделать это нет, поскольку итераторы поддерживают только операции увеличения и уменьшения для перемещения вперед и назад.

2D-вектор - это матрица , поэтому вам понадобятся два типа итераторов: итератор строки и итератор столбца. Итераторы строк будут перемещать матрицу «вверх» и «вниз», а итераторы столбцов будут перемещаться «влево» и «вправо».

Вы должны реализовать эти классы итераторов самостоятельно, что не обязательно является тривиальной задачей. Если, конечно, вы просто не хотите перебирать каждый слот в матрице, и в этом случае двойной цикл for с использованием индексных переменных i и j будет работать нормально. В зависимости от ваших потребностей (вашему сообщению здесь немного не хватает содержания), вы можете использовать boost :: numeric :: ublas :: matrix , который является матричным классом из библиотеки линейной алгебры Boost. Этот матричный класс имеет встроенные итераторы строк и столбцов, которые обычно упрощают итерацию по матрице.

в этом случае цикл double for с использованием индексных переменных i и j будет работать нормально. В зависимости от ваших потребностей (вашему сообщению здесь немного не хватает содержания), вы можете использовать boost :: numeric :: ublas :: matrix , который является матричным классом из библиотеки линейной алгебры Boost. Этот матричный класс имеет встроенные итераторы строк и столбцов, которые обычно упрощают итерацию по матрице.

в этом случае цикл double for с использованием индексных переменных i и j будет работать нормально. В зависимости от ваших потребностей (вашему сообщению здесь немного не хватает содержания), вы можете использовать boost :: numeric :: ublas :: matrix , который является матричным классом из библиотеки линейной алгебры Boost. Этот матричный класс имеет встроенные итераторы строк и столбцов, которые обычно упрощают итерацию по матрице.

0
ответ дан 29 November 2019 в 06:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: