c++ 在使用VSCode将std::pair推送到我的图形代码中的向量时,什么可能导致'expected expression'错误?

falq053o  于 2023-05-30  发布在  Vscode
关注(0)|答案(2)|浏览(279)
#include <iostream>
#include <sstream>
#include <vector>
#define ii pair<int, int>
using namespace std;

// DSK -> DSC
int n;
vector <ii> edge;
string s, num;

int main()
{
    cin >> n;
    cin.ignore();
    for(int i = 1; i <= n; i++)
    {
        getline(cin, s);
        stringstream ss(s);
        while(ss >> num)
            if(i < stoi(num))
                edge.push_back({i, stoi(num)});
    }
    return 0;
}
error: expected expression
                edge.push_back({i, stoi(num)});
                               ^

当使用VSCode将std::pair推送到vector时,如何修复图形代码中的'expected expression'错误?

hkmswyz6

hkmswyz61#

我的精神力量表明你在使用旧版本的C++。C11?不确定您使用的是哪种编译器,但是有一些命令行标志可以将编译器环境设置为比默认值更新的标准。
clang/g
-std=c++17
MSVC:/std:c++17
无论如何,有比与编译器斗争更简单的方法来解决这个问题。只要给它所期望的类型,而不是试图推断如何强制内联参数,就可以让它高兴了。
对于实际上只有几个int的情况,这不会导致任何性能损失。编译器会优化零售版本中的额外副本(如果有的话):
而不是这样:

edge.push_back({i, stoi(num)});

这是:

std::pair<int,int> p = {i, stoi(num)};
edge.push_back(p);

专业提示与你的问题无关。对于嵌套的语句,总是使用花括号,即使它只是一行。它将防止以后由于没有显式声明块而容易发生的错误。而不是这样:

while(ss >> num)
            if(i < stoi(num))
                edge.push_back({i, stoi(num)});

这是:

while(ss >> num)
        {
            if(i < stoi(num))
            {
                edge.push_back({i, stoi(num)});
            }
        }

总而言之:

while(ss >> num)
    {
        if(i < stoi(num))
        {
            std::pair<int,int> p = {i, stoi(num)};
            edge.push_back(p);
        }
    }

建议使用make_pairemplace_back的其他答案和评论也是很好的建议。

of1yzvn4

of1yzvn42#

我想你可以用make_pair()函数。

edge.push_back(make_pair(i, stoi(num)));

相关问题