C++中的foreach循环相当于C#中的哪个?

80

我该如何将这段代码转换成C++?

string[] strarr = {"ram","mohan","sita"};    
foreach(string str in strarr) {
  listbox.items.add(str);
}
11个回答

127

范围for循环:

std::array<std::string, 3> strarr = {"ram", "mohan", "sita"};
for(const std::string& str : strarr) {
  listbox.items.add(str);
}

pre c++11

std::string strarr[] = {"ram", "mohan", "sita"};
for(int i = 0; i < 3; ++i) {
  listbox.items.add(strarr[i]);
}

或者
std::string strarr[] = {"ram", "mohan", "sita"};
std::vector<std::string> strvec(strarr, strarr + 3);
std::vector<std::string>::iterator itr = strvec.begin();
while(itr != strvec.end()) {
  listbox.items.add(*itr);
  ++itr;
}

使用 Boost

boost::array<std::string, 3> strarr = {"ram", "mohan", "sita"};
BOOST_FOREACH(std::string & str, strarr) {
  listbox.items.add(str);
}

3
@ronag说:“这里接受的答案反映了我的对std::for_each的看法。”链接为:https://dev59.com/sXI-5IYBdhLWcg3wBjnl。 - missingfaktor
2
第一个代码示例中,关于数组大小的部分怎么处理呢,比如 for(int i = 0; i < sizeof(strarr)/sizeof(strarr[0]); i++) - Thorben
由于C++11已经有6年历史,且已更新三个标准版本,我可以建议将问题中的C++11部分放在前面。事实上,让我们假设C++11是默认设置,不提及C++。因此,使用C++98来代替其他部分。 - bolov
@bolov,老兄,这是七年前的回答了。我已经六年没有写过C++了。请随意更新答案。 - missingfaktor
@missingfaktor 当然,没问题。 - bolov

29

在C++0x中,你有

for(string str: strarr) { ... }

但在那之前请使用普通的for循环。


14

在熟悉了C#中的var关键字后,我开始使用C++11中的auto关键字。它们都通过推断来确定类型,在你只需要编译器为你确定类型时非常有用。以下是你的代码的C++11版本:

#include <array>
#include <string>

using namespace std;

array<string, 3> strarr = {"ram", "mohan", "sita"};
for(auto str: strarr) {
  listbox.items.add(str);
}

6

我知道谷歌在这方面不太好,所以不是你的错,但最新版本是1.44,所以链接应该包含1_44,而不是1_35。(你需要手动修复谷歌的结果。) - GManNickG
谢谢。我已经在我的系统上下载并构建了1.44版,但当我发布那篇文章时没有考虑到版本问题。 - user439793

5

只是为了好玩(新的 Lambda 函数):

      static std::list<string> some_list;

      vector<string> s; 
      s.push_back("a");
      s.push_back("b");
      s.push_back("c");

      for_each( s.begin(), s.end(), [=](string str) 
        {
          some_list.push_back(str);
        }

  );

  for_each( some_list.begin(), some_list.end(), [](string ss) { cout << ss; } );

尽管简单的循环是推荐的 :-)

2

Something like:

const char* strarr = {"ram","mohan","sita", 0L};

for(int i = 0; strarr[i]; ++i)
{
  listbox.items.add(strarr[i]);
}

这也适用于标准C。不确定如何在C++中检测strarr的末尾而没有null元素,但上面的方法应该可行。


如果它是一个静态分配的数组,那么 sizeof(strarr)/sizeof(strarr[0]) 可以得到数组中元素的数量;然而,如果它是一个动态分配的数组(或者你只有一个指针),那么就没有办法获取大小 -- 你必须通过其他的手段来获取。 - Adam Rosenfield
数组大小(因此也是索引)的正确类型是 std::size_t - sbi

1
#include <string>
std::string strarr = { "ram", "mohan", "sita" };

或者

const char* strarr[] = { "ram", "mohan", "sita" };

在字符串数组strarr中,对于每个字符串str,执行以下操作: { listbox.items.add(str); }
for (int i = 0; i < sizeof strarr / sizeof *strarr; ++i)
    listbox.items.add(strarr[i]);

注意:您也可以将字符串放入std::vector而不是数组中:
std::vector<std::string> strvec;
strvec.push_back("ram");
strvec.push_back("mohan");
strvec.push_back("sita");

for (std::vector<std::string>::const_iterator i = strvec.begin(); i != strvec.end(); ++i)
    listbox.items.add(*i);

1

简单的表单:

std::string  data[] = {"ram","mohan","sita"};
std::for_each(data,data+3,std::bind1st(std::mem_fun(&Y::add), &(listbox.items)));

一个实际的例子:

#include <algorithm>
#include <string>
#include <iostream>
#include <functional>

class Y
{
    public:
      void add(std::string value)
      {
          std::cout << "Got(" << value << ")\n";
      }
};
class X
{
    public:
      Y  items;
};

int main()
{
    X listbox;

    std::string  data[] = {"ram","mohan","sita"};
    std::for_each(data,data+3,std::bind1st(std::mem_fun(&Y::add), &(listbox.items)));
}

0
使用C++14:
#include <string>
#include <vector>


std::vector<std::string> listbox;
...
std::vector<std::string> strarr {"ram","mohan","sita"};    
for (const auto &str : strarr)
{
    listbox.push_back(str);
}

这个可以不缩写成 for (const auto &str : {"ram","mohan","sita"} ) ... 吗? - intDattashame

0

使用boost是最好的选择,因为它可以帮助您提供整洁简明的代码,但如果您想坚持使用STL

void listbox_add(const char* item, ListBox &lb)
{
    lb.add(item);
}

int foo()
{
    const char* starr[] = {"ram", "mohan", "sita"};
    ListBox listBox;
    std::for_each(starr,
                  starr + sizeof(starr)/sizeof(char*),
                  std::bind2nd(std::ptr_fun(&listbox_add), listBox));

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接