使用 VSCode 将 std::pair 推送到图形代码中的向量时,可能会导致“预期表达式”错误的原因是什么?

0 c++ graph vector push-back std-pair

#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;
}
Run Code Online (Sandbox Code Playgroud)
error: expected expression
                edge.push_back({i, stoi(num)});
                               ^
Run Code Online (Sandbox Code Playgroud)

使用 VSCode 将 std::pair 推送到向量时,如何修复图形代码中的“预期表达式”错误?

sel*_*bie 5

我的通灵能力表明你使用的是旧版本的 C++。也许是 C++11?不确定您使用的是哪个编译器,但有一些命令行标志可以将编译器环境设置为比默认值更新的标准。

铿锵/g++:-std=c++17

微软VC:/std:c++17

无论如何,有比与编译器对抗更简单的方法来解决这个问题。只需为其提供所需的类型即可使其满意,而不是尝试推断如何强制内联参数。

对于实际上只有几个整数的情况,这不会导致任何性能损失。无论如何,编译器都会优化零售版本中的额外副本(如果有):

而不是这个:

edge.push_back({i, stoi(num)});
Run Code Online (Sandbox Code Playgroud)

这:

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

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

        while(ss >> num)
            if(i < stoi(num))
                edge.push_back({i, stoi(num)});
Run Code Online (Sandbox Code Playgroud)

这:

        while(ss >> num)
        {
            if(i < stoi(num))
            {
                edge.push_back({i, stoi(num)});
            }
        }
Run Code Online (Sandbox Code Playgroud)

总而言之:

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

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