我想知道是否有Delphi的等效项
var
StringList: TStringList;
for str in StringList do
在C ++ Builder中。
答案 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::vector
与std::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++