【问题标题】:Foreach loop in C++ equivalent of C#C++ 中的 Foreach 循环等效于 C#
【发布时间】:2011-04-08 14:47:38
【问题描述】:

如何将此代码转换为 C++?

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

【问题讨论】:

    标签: c# c++


    【解决方案1】:

    如果你有一个数组,你可以简单地使用for 循环。 (很抱歉,我不会为您输入 for 循环的代码。)

    【讨论】:

      【解决方案2】:

      在 C++0x 中你有

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

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

      【讨论】:

        【解决方案3】:

        Boost 有一个宏可以为您执行此操作。

        http://www.boost.org/doc/libs/1_44_0/doc/html/foreach.html

        【讨论】:

        • 我知道谷歌在这方面很糟糕,所以不是你的错,但最新版本是 1.44,所以链接应该是 1_44,而不是 1_35。 (您必须手动修复 Google 搜索结果。)
        • 谢谢。我已经在我的系统上下载并构建了 1.44,但我发布它时并没有考虑版本。
        【解决方案4】:

        类似:

        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
        【解决方案5】:

        ranged based 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);
        }
        

        【讨论】:

        • @ronag:接受的答案here反映了我对std::for_each的看法。
        • 关于第一个代码示例中for(int i = 0; i &lt; sizeof(strarr)/sizeof(strarr[0]); i++) 等数组的大小如何?
        • 由于 C++11 已有 6 年历史和 3 个标准,我建议将问题的 C++11 部分移至顶部。事实上,让我们假设 C++11 是默认的,不提 C++。取而代之的是 C++98。
        • @bolov,这是一个七年前的答案,伙计。我已经六年没有写过 C++ 了。请随时更新您认为合适的答案。
        • @missingfaktor 当然,没问题
        【解决方案6】:

        字符串[] strarr = {"ram","mohan","sita"};

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

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

        foreach(str 中的字符串 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);
        

        【讨论】:

          【解决方案7】:

          只是为了好玩(新的 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; } );
          

          虽然建议做一个简单的循环:-)

          【讨论】:

            【解决方案8】:

            使用 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));
            
            }
            

            【讨论】:

              【解决方案9】:

              简单的形式:

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

              【讨论】:

                【解决方案10】:

                在习惯了 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);
                }
                

                【讨论】:

                  【解决方案11】:

                  使用 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 &amp;str : {"ram","mohan","sita"} ) ...吗?
                  猜你喜欢
                  • 2013-11-23
                  • 1970-01-01
                  • 2016-03-04
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2012-05-23
                  • 2013-10-30
                  • 2010-11-16
                  相关资源
                  最近更新 更多