与C#等效的C ++中的Foreach循环


75

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

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

Answers:


123

范围基于

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

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
missingfaktor

2
for(int i = 0; i < sizeof(strarr)/sizeof(strarr[0]); i++)第一个代码示例中那样,如何处理数组的大小呢?
Thorben 2014年

由于C ++ 11已有6年历史,并且提供3条标准,因此我建议将问题的C ++ 11部分移到顶部。实际上,我们假定C ++ 11为默认值,并且不提及C ++。相反,请提及C ++ 98。
bolov

@bolov,这是一个七岁的孩子,老兄。我已经六年没有写C ++了。请随时根据需要更新答案。
missingfaktor

@missingfaktor当然,没问题
bolov

29

在C ++ 0x中,您拥有

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

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


14

在习惯了varC#中的关键字之后,我开始auto在C ++ 11中使用该关键字。它们都通过推断来确定类型,并且在您只希望编译器为您确定类型时很有用。这是代码的C ++ 11端口:

#include <array>
#include <string>

using namespace std;

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


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

就像是:

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

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

也适用于标准C。不确定在C ++中如何在没有null元素的情况下检测strarr的结尾,但是上述方法应该可以工作。


如果它是静态分配的数组,则sizeof(strarr)/sizeof(strarr[0])可以获取数组中元素的数量;但是,如果它是一个动态分配的数组(或者如果您拥有的只是一个指针),那么就无法获取大小-您必须通过其他一些带外方法来获取它。
亚当·罗森菲尔德

数组大小(因此是数组的索引)的正确类型是std::size_t
2010年

1

string [] strarr = {“ ram”,“ mohan”,“ sita”};

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

要么

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

foreach(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

如果有数组,则可以简单地使用for循环。(很抱歉,但我不会for为您键入循环代码。)


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));

}

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,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.