在C ++ Builder中,是否有等效于“ StringList中的for str”的工具?

时间:2019-01-28 10:57:44

标签: delphi c++builder

我想知道是否有Delphi的等效项

var 
   StringList: TStringList;
for str in StringList do 

在C ++ Builder中。

3 个答案:

答案 0 :(得分:4)

与其他答案不同,编译器很重要。只有C ++ Builder可以使用 Visual Component Library 中的类型,该组件是用Delphi(对象Pascal)编写的。

TStringList 是这样的一个类。它是 System :: String 实例(即不是包含 std :: string 实例的 std :: vector 的容器)(带有一些其他功能) )。

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 字符串的特殊处理等)。

更新

我一定做错了。正如雷米·勒博(Remy Lebeau)所指出的,实际上这是可能的:

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

for (System::String str : list)
{
    std::wcout << str.c_str() << std::endl;
}

答案 1 :(得分:3)

编译器或IDE无关紧要。您为std::string使用什么容器?

例如,通常,如果您将std::vectorstd::string一起使用,则可以编写

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

这适用于许多其他容器和类。

编辑:原始文本没有透露关于TStringList的任何内容,但是,如果 TStringList提供了迭代器,则代码应该易于转移。

答案 2 :(得分:3)

每个Embarcadero的DocWiki:

C++ Iterator Support for Delphi Enumerable Types and Containers

  

以下是可作为一种类型的迭代器的经验法则的准则。

     
      
  • 如果类型仅具有GetEnumerator()方法,则可以使用 Range-for和有限的一组只读STL算法

  •   
  • 如果类型具有下标operator[],则可以使用 Range-for和所有只读的STL算法

  •   
  • ...

  •   
     

...

     

TRandomIterator::<T,E>

     

TRandomIterator::<T,E>是为每个实现整数下标运算符E operator[ ](int)和整数Count属性的RTL容器定义的。
  ...

     

TEnumerableIterator<T>

     

TEnumerableIterator::<T>是为每个实现GetEnumerator()方法的Delphi RTL容器定义的。返回的枚举器类型还必须支持GetCurrent()MoveNext()方法。 此模式在RTL代码中经常使用,因此它覆盖了很大一部分容器
  ...

TStringList同时满足GetEnumerator()operator[]的要求,因此,至少在CLang-based compilers中,您可以执行以下操作:

TStringList *StringList = ...;

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

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

此功能已在C ++ Builder 10.1 Berlin中添加。

有关更多详细信息,请参见Using Delphi containers from C++