for loop 的 init-语句,包含两种类型的变量

for loop's init-statement with two types of variable

本文关键字:两种 类型 包含 变量 语句 loop init- for      更新时间:2023-10-16

我想在for的init语句中声明两种类型的变量。像下面的代码一样。我知道"for (string word, int numb,;cin>>词>>麻木。这行不通。只是想让你知道我在做什么。我的目标是声明具有相同生命周期的两种类型的变量,并将它们放在一起。其他编码方式也很有帮助。提前谢谢。

#include <iostream>
#include <vector>
#include <string>
#include <utility>
using namespace std;
int main ()
{
    cout<<"enter a word and a number"<<endl;
    for (string word, int numb, ; cin>>word>>numb; )
    {
        //do some work      
    }
return 0;
}

好吧,我想这是我能得到的最接近别人建议的了。

#include <iostream>
#include <vector>
#include <string>
#include <utility>
using namespace std;
int main ()
{
    vector<pair<string,int> > pvec;
    cout<<"enter a word and a number"<<endl;
    {
        int numb=0; 
        for (string word; cin>>word>>numb; )
            pvec.push_back(make_pair(word,numb));
    }
    cout<<pvec[3].second<<endl;
return 0;
} 

关于你能得到的最接近的是:

int main ()
{
    cout<<"enter a word and a number"<<endl;
    {
        string word;
        for (int numb; cin>>word>>numb; )
        {
            //do some work      
        }
    }
    return 0;
}

额外的一组花括号限制了word的作用域,类似于循环限制numb的作用域。显然,你可以反转声明;使用

可能更好(更对称)
int main ()
{
    cout<<"enter a word and a number"<<endl;
    {
        string word;
        int numb;
        while (cin>>word>>numb)
        {
            //do some work      
        }
    }
    return 0;
}

由于没有自增或初始化操作,代码实际上是一个带有几个声明变量的while循环;

这不可能。可以在for循环的初始化语句中声明两个基本类型相同的变量,但不能声明两个基本类型不同的变量。你必须在for循环之外声明一个。

我很确定在for语句中声明两种不同类型的两个变量是不可能的,但我也看不出这样做有什么好处:

int main ()
{
    cout<<"enter a word and a number"<<endl;
    while( cin.good() )
    {
        string word;
        int num;
        cin >> word >> num;
        //do some work      
    }
    return 0;
}

一般来说,我更喜欢在需要计数或至少迭代的地方使用for循环。其他情况下应该使用while或do循环。

你尝试的方法不是最干净的方法。我想这样做:

string word;
int num;
while(true)
{
    cin >> word >> num;
    if (!cin.good()) break;
    // do some work
}

wordnum在同一作用域(相同的"寿命")

请注意,您需要将while(true)替换为一些合适的条件。


如果您希望word和num在循环范围内,请执行如下操作:

while(true)
{
    string word;
    int num;
    cin >> word >> num;
    if (!cin.good()) break;
    // do some work
}

{
    string word;
    int num;
    while(true)
    {
        cin >> word >> num;
        if (!cin.good()) break;
        // do some work
    }
}

我不知道为什么这是必要的

下面是未经测试的,但应该可以工作:

int main()
{
  std::cout << "enter a word and a number" << endl;
  for (struct { std::string word, int number } vars;
       std::cin >> vars.word >> vars.number;
      )
  {
    //do some work      
  }
  return 0;
}

c++17起:

#include <iostream>
#include <tuple>
int main() {
    for (auto && [w,i] =  std::tuple{std::string{},int{}} ; std::cin >> w >> i ; )
        std::cout << "word " << w << " number " << i << "n";
    return 0;
}