Как я могу выполнить итерации через строку и также знать индекс (текущая позиция)?

Я использовал Emacs в качестве своей основной среды и для разработки и для почты/новостей для приблизительно 10-летнего (1994-2004). Я обнаружил питание IDE, когда я вынудил меня изучить Java в 2004, и к моему удивлению что мне на самом деле понравился IDE ( ИДЕЯ IntelliJ ).

я не войду в определенные причины, так как многие из них были уже упомянуты здесь - просто помнят, что различные люди любят различные функции. Меня и коллегу использовал тот же IDE, мы оба использовали просто часть доступных функций, и нам не понравился каждый другие способ использовать IDE (но нам понравился сам IDE).

, Но существует одно преимущество с IDE по связанным средам Emacs/Vim, на которых я хочу сфокусироваться: Вы проводите меньше времени, устанавливая/настраивая функции, которые Вы хотите.

С крыло IDE (для Python) я готов начать разрабатывать спустя 15-20 минут после установки. Никакая идея, сколько часов я должен был бы получить функции, которые я израсходовал и работающий с Emacs/Vim. :)

54
задан hellow 6 September 2018 в 23:53
поделиться

6 ответов

Я никогда не слышал о лучших методах ответа на этот конкретный вопрос. Однако, как правило, лучше всего использовать простейшее решение, решающее проблему. В этом случае доступ в стиле массива (или в стиле c, если вы хотите его так называть) - это самый простой способ выполнить итерацию, имея доступное значение индекса. Так что я определенно рекомендую этот способ.

46
ответ дан 7 November 2019 в 07:48
поделиться

Вот так:


    std::string s("Test string");
    std::string::iterator it = s.begin();

    //Use the iterator...
    ++it;
    //...

    std::cout << "index is: " << std::distance(s.begin(), it) << std::endl;
49
ответ дан 7 November 2019 в 07:48
поделиться

Вы можете использовать стандартное расстояние функции STL, как упоминалось ранее

index = std::distance(s.begin(), it);

Кроме того, вы можете получить доступ к строке и некоторым другим контейнерам с помощью c-подобного интерфейса:

for (i=0;i<string1.length();i++) string1[i];
21
ответ дан 7 November 2019 в 07:48
поделиться

Хорошая практика будет основана на удобочитаемости, например:

string str ("Test string");
for (int index = 0, auto it = str.begin(); it < str.end(); ++it)
   cout << index++ << *it;

Или:

string str ("Test string");
for (int index = 0, auto it = str.begin(); it < str.end(); ++it, ++index)
   cout << index << *it;

Или ваш оригинал:

string str ("Test string");
int index = 0;
for (auto it = str.begin() ; it < str.end(); ++it, ++index)
   cout << index << *it;

Так далее. То, что для вас проще и понятнее.

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

10
ответ дан 7 November 2019 в 07:48
поделиться

Для строк вы можете использовать string.c_str () , который вернет вам const char *, который можно рассматривать как массив, например:

const char* strdata = str.c_str();

for (int i = 0; i < str.length(); ++i)
    cout << i << strdata[i];
0
ответ дан 7 November 2019 в 07:48
поделиться

Я бы использовал it-str.begin () В этом конкретном случае std :: distance и operator- совпадают. Но если контейнер изменится на что-то без произвольного доступа, std :: distance будет увеличивать первый аргумент до тех пор, пока не достигнет второго, давая, таким образом, линейное время, и оператор не будет компилироваться. Лично я предпочитаю второе поведение - лучше получать уведомления, когда ваш алгоритм из O (n) становится O (n ^ 2) ...

3
ответ дан 7 November 2019 в 07:48
поделиться
Другие вопросы по тегам:

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