如何删除向量中的元组? C++ [已关闭]

问题描述 投票:0回答:2

我已经编程了 1 周,我有一个向量>edgesVector 其中包含两个字符串和一个 INT。如何删除向量中包含两个特定字符串的元组?

错误是(简而言之):没有匹配的函数可以调用 矢量::擦除(元组


remove_edge(const string& u, const string& v) {

    for (int i = 0; i<edgesVector.size(); i++ ) {
        if (get<0>(edgesVector[i]) == u && get<1>(edgesVector[i]) == v){
            edgesVector.erase(i);//error
        }
        if (get<1>(edgesVector[i]) == u && get<0>(edgesVector[i])== v){
            edgesVector.erase(i);//error
        }

    }           


}
c++ vector tuples
2个回答
3
投票

您使用

std::remove_if
,并将结果传递给
edgesVector.erase
。这称为“擦除删除惯用语”。 void remove_edge(const string& u, const string& v) { auto it = std::remove_if(edgesVector.begin(), edgesVector.end(), [&](auto & tup){ return (get<0>(tup) == u) && (get<1>(tup) == v); }); // removes elements that match u, v it = std::remove_if(edgesVector.begin(), it, [&](auto & tup){ return (get<0>(tup) == v) && (get<1>(tup) == u); }); // removes elements that match v, u edgesVector.erase(it, edgesVector.end()); // resize the vector to only hold live elements }



0
投票
erase-remove

成语是可行的方法,但是您的代码片段的问题很容易解决。

std::vector::erase

 采用 
iterator 作为参数,而您向其传递 index for (auto itr = edgesVector.begin(); itr != edgesVector.end();) { if ((get<0>(*itr) == u && get<1>(*itr) == v) || (get<1>(*itr) == u && get<0>(*itr)== v)) itr = edgesVector.erase(itr); else ++itr; } }

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.