Есть ли в C ++ Builder эквивалент «for str в StringList do»? - PullRequest
0 голосов
/ 28 января 2019

Я хочу знать, есть ли эквивалент для Delphi

var 
   StringList: TStringList;
for str in StringList do 

в C ++ Builder.

Ответы [ 3 ]

0 голосов
/ 28 января 2019

В отличие от того, что говорит другой ответ, компилятор имеет большое значение .Только C ++ Builder может использовать типы в библиотеке визуальных компонентов , которая написана на Delphi (Object Pascal).

TStringList является одним из таких классов.Это контейнер (с некоторыми дополнениями) для System :: String экземпляров (то есть не std :: vector , содержащий std :: string экземпляров).

TStringList не предоставляет итераторов C ++, поэтому AFAIK, в настоящее время, ваш единственный выбор - индексирование:

TStringList *list = new TStringList();
// fill list
for (int i = 0; i < list->Count; ++i)
{
    // ...
}
delete list;

Конечно, вы можете использовать std::vector<System::String>, но это не даст вам дополнительной функциональности TStringList (например, хранение связанных объектов - например, растровых изображений - или специальную обработку key = value строки т. д.).

Обновление

Я, должно быть, сделал что-то не так.Как отметил Реми Лебо, это на самом деле возможно:

TStringList *list = new TStringList();
list->Add("Hello");
list->Add("World");

for (System::String str : list)
{
    std::wcout << str.c_str() << std::endl;
}
0 голосов
/ 28 января 2019

В DocWiki Embarcadero:

Поддержка итератора C ++ для перечисляемых типов и контейнеров Delphi

Ниже приведены рекомендации, которые можно использовать в качестве практического правила.для которых итераторы доступны для типа.

  • Если тип имеет только метод GetEnumerator(), вы можете использовать Range-for и ограниченный набор STL только для чтения.Алгоритмы .

  • Если у типа есть индекс operator[], вы можете использовать Range-for и все алгоритмы STL только для чтения .

  • ...

...

TRandomIterator::<T,E>

TRandomIterator::<T,E> определено для каждый контейнер RTL, который реализует оператор целочисленного индекса E operator[ ](int) и целочисленное свойство Count .
...

TEnumerableIterator<T>

TEnumerableIterator::<T> -определено для каждого контейнера Delphi RTL, который реализует метод GetEnumerator() .Возвращаемый тип перечислителя также должен поддерживать методы GetCurrent() и MoveNext(). Этот шаблон часто используется в коде RTL, поэтому он охватывает значительную часть контейнеров .
...

TStringList удовлетворяет требованиям для обоих GetEnumerator()и operator[], и, как таковой, по крайней мере в CLang-ориентированных компиляторах , вы можете делать такие вещи:

TStringList *StringList = ...;

for (auto str : StringList)
{
    ...
}

std::for_each(std::begin(StringList), std::end(StringList), ...);

Эта функциональность была добавлена ​​в C ++ Builder 10.1Берлин.

Подробнее см. Использование контейнеров Delphi из C ++

0 голосов
/ 28 января 2019

Компилятор или IDE не имеют большого значения.Какой контейнер вы используете для std::string s?

Как правило, например, если вы используете std::vector с std::string, вы можете написать

std::vector<std::string> strings;
// fill them
for(auto& string : strings)

Это работает длямножество других контейнеров и классов.

edit: исходный текст ничего не говорит о TStringList, тем не менее, код должен легко передаваться, , если TStringList предлагает итераторы.

...