【问题标题】:Searching Vector of Struct [duplicate]搜索结构的向量[重复]
【发布时间】:2020-03-29 08:23:24
【问题描述】:

我有一个这样的结构:

struct Stock{
    int id;
    string title;
    string colour;
    string size;
    int quantity;
    float cost;
}

矢量

vector<Stock> all_data;

现在我想通过 ID 在 all_data 向量中搜索特定股票。我该怎么做?

【问题讨论】:

  • 你遍历向量,检查里面的每个Stock,看看它是否是正确的。
  • 除了在循环中有一个 if 语句的直接答案,还可以看看this So post
  • Edit 问题并将实际结构放入其中。 id 不是 Stock 的私人成员,因为现在的问题是 - 你只在对其中一个答案的评论中提到。

标签: c++ algorithm struct iterator find


【解决方案1】:
for(auto data : all_data){
    if(data.id == id)
        std::cout << "Found";
}

【讨论】:

  • @user11453590 您应该将此添加到您的问题中。但是,C++ 中的 struct 关键字意味着(默认情况下)结构的所有成员都是公共的。所以你的问题显然缺少一些东西
  • @user11453590 如果idStock 的私有成员,那么您向我们展示的Stock 定义与实际不同。请不要浪费我们的时间,并使用您的实际代码/案例更仔细地编写您的问题。
  • @DanielsaysreinstateMonica 我同意,但请友好一点。用户显然在学习,并不意味着他们粗心。你也没有帮助
  • @kyriakosSt 要求修复没有错误的代码中的错误是粗心的,还有什么?
  • @foreknownas_463035818 我非常不同意这个具体案例,但我们可以有不同的意见。很抱歉开始这个对话
【解决方案2】:

您可以使用标准算法std::find_if。例如

#include <vector>
#include <iterator>
#include <algorithm>

//…

int id = some_value;

auto it = std::find_if( std::begin( all_data ), std::end( all_data ),
                        [=]( const Staock &stocl )
                        {
                            return stock.id == id;
                        } );

if ( it != std::end( all_data ) )
{
    std::cout << it->id << '\n';
}

您可以使用函数对象 std::equal_tostd::bind 代替 lambda,前提是您要比较 Stock 类型的整个对象或声明相应的比较运算符。

这是一个使用 lambda 的演示程序

#include <iostream>
#include <string>
#include <vector>
#include <iterator>
#include <algorithm>

struct Stock{
    int id;
    std::string title;
    std::string colour;
    std::string size;
    int quantity;
    float cost;
};

int main() 
{
    std::vector<Stock> all_data =
    {
        { 1, "A" }, { 2, "B" }, { 3, "C" }, { 4, "D" }, { 5, "E" }
    };

    int id = 3;

    auto it = std::find_if( std::begin( all_data ), std::end( all_data ),
                            [=]( const Stock &stock )
                            {
                                return stock.id == id;
                            } );

    if ( it != std::end( all_data ))
    {
        std::cout << it->id << ": " << it->title << '\n';
    }

    return 0;
}

它的输出是

3: C

【讨论】:

    【解决方案3】:

    你可以试试

    it = std::find_if(all_data.begin(), all_data.end(), std::bind(&all_data::id, _1) == data.id);
    

    来自#include &lt;algorithm&gt;

    或者,您可以编写自己的函数对象

    struct find_id : std::unary_function<Stock, bool> {
        int id;
        find_id(int id):id(id) { }
        bool operator()(Stock const& m) const {
            return m.id == id;
        }
    };
    
    it = std::find_if(alll_data.Stock.begin(), all_data.Stock.end(), 
             find_id(currentStockObject));
    

    根据需要修改。

    【讨论】:

    • 好奇心:为什么要从unary_function继承?
    • 有趣。 unary_function 在 C++11 中被弃用,应该在 C++17 中被删除,但 clang++g++ 都保留了它。 godbolt.org/z/JgbXDR
    猜你喜欢
    • 2020-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-25
    • 2017-03-22
    • 1970-01-01
    相关资源
    最近更新 更多