Я использовал Emacs в качестве своей основной среды и для разработки и для почты/новостей для приблизительно 10-летнего (1994-2004). Я обнаружил питание IDE, когда я вынудил меня изучить Java в 2004, и к моему удивлению что мне на самом деле понравился IDE ( ИДЕЯ IntelliJ ).
я не войду в определенные причины, так как многие из них были уже упомянуты здесь - просто помнят, что различные люди любят различные функции. Меня и коллегу использовал тот же IDE, мы оба использовали просто часть доступных функций, и нам не понравился каждый другие способ использовать IDE (но нам понравился сам IDE).
, Но существует одно преимущество с IDE по связанным средам Emacs/Vim, на которых я хочу сфокусироваться: Вы проводите меньше времени, устанавливая/настраивая функции, которые Вы хотите.
С крыло IDE (для Python) я готов начать разрабатывать спустя 15-20 минут после установки. Никакая идея, сколько часов я должен был бы получить функции, которые я израсходовал и работающий с Emacs/Vim. :)
Я никогда не слышал о лучших методах ответа на этот конкретный вопрос. Однако, как правило, лучше всего использовать простейшее решение, решающее проблему. В этом случае доступ в стиле массива (или в стиле c, если вы хотите его так называть) - это самый простой способ выполнить итерацию, имея доступное значение индекса. Так что я определенно рекомендую этот способ.
Вот так:
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;
Вы можете использовать стандартное расстояние функции STL, как упоминалось ранее
index = std::distance(s.begin(), it);
Кроме того, вы можете получить доступ к строке и некоторым другим контейнерам с помощью c-подобного интерфейса:
for (i=0;i<string1.length();i++) string1[i];
Хорошая практика будет основана на удобочитаемости, например:
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;
Так далее. То, что для вас проще и понятнее.
Неясно, есть ли какой-то лучший метод, поскольку вам где-то понадобится переменная счетчика. Кажется, вопрос в том, подходит ли вам то, где вы его определяете и как он увеличивается.
Для строк вы можете использовать string.c_str ()
, который вернет вам const char *, который можно рассматривать как массив, например:
const char* strdata = str.c_str();
for (int i = 0; i < str.length(); ++i)
cout << i << strdata[i];
Я бы использовал it-str.begin () В этом конкретном случае std :: distance и operator- совпадают. Но если контейнер изменится на что-то без произвольного доступа, std :: distance будет увеличивать первый аргумент до тех пор, пока не достигнет второго, давая, таким образом, линейное время, и оператор не будет компилироваться. Лично я предпочитаю второе поведение - лучше получать уведомления, когда ваш алгоритм из O (n) становится O (n ^ 2) ...