在 c++ 中寻找可枚举的适当容器/函数

Posted

技术标签:

【中文标题】在 c++ 中寻找可枚举的适当容器/函数【英文标题】:Looking for proper container / functions for enumerable in c++ 【发布时间】:2013-04-29 19:12:21 【问题描述】:

我正在尝试将一些代码从 c# 转换为 c++,但缺少字典表/可枚举项等,这使我难以获得 c++ 所需的结果。任何人都可以帮助了解在 c++ 中使用的容器/方法的类型以获得所需的结果吗?

提前致谢。

找到所有 c1 和它的 count group by c1 where c2 > 0 and c3

table(c1,c2,c3)  ( number of rows expected is not finite - so - can't use Array as a structure for this )
5 1 2
4 2 3  --> edited this line to make it into the list
4 4 3
4 0 1  --> ignore this row as c2=0
3 1 3  
2 1 5  --> ignore this row as c3 > 4
.....

.....

expected output(number of rows meeting criteria for each c1):
3 1
4 2
5 1

【问题讨论】:

【参考方案1】:

你至少需要:

struct 用于保存每个 c1/c2/c3 元组(如果使用 C++11,则为 std::tuple)。 一个std::vector(类似数组的容器,但具有动态大小)来保存所有元组。 std::map(已排序的关联容器)充当字典来计算输出。

我相信这足以让您入门,如果您在实际编写代码时遇到特定问题,请不要犹豫提出新问题。


根据您的 cmets 进行编辑:

您并没有错过太多,elvena 的解决方案几乎正是您所需要的,只是它缺少用于存储对象的矢量容器。这很简单:

#include <iostream>
#include <map>
#include <vector>
#include <tuple>

int main()

    std::vector<std::tuple<int, int, int>> values;
    while (you_have_more_data) 
        int c1, c2, c3;
        // somehow read c1, c2, c3 from cin/file/whatever
        values.push_back(std::make_tuple(c1, c2, c3));
    

    std::map<int, int> dict;
    // iterate over the vector
    for (auto i = values.begin(); i != values.end(); ++i) 
        // *i (dereferencing the iterator) yields a std::tuple<int, int, int>
        // use std::get to access the individual values in the tuple
        // 0 => c1; 1 => c2; 2 => c3 (same order as in std::make_tuple)
        if (std::get<1>(*i) > 0 && std::get<2>(*i) < 4)
            dict[std::get<0>(*i)] += 1; // see std::map::operator[]
    

    // iterate over the map and print its items
    for (auto i = dict.begin(); i != dict.end(); ++i)
        // *i (dereferencing the iterator) yields a std::pair<int, int>
        // but writing (*i).first is cumbersome
        // let's write i->first instead (this is the same, just a different notation)
        std::cout << i->first << " " << i->second << std::endl;

    return 0;

【讨论】:

谢谢 syam。我正在使用 c++11,实际上开始了一些类似的路径,但没有取得太大进展。在 c# 中,我可以制作基表的过滤器(视图),然后应用过滤器/组/排序选项来获得所需的输出。会再做一次,看看我能不能用这个..谢谢 @ejuser:我编辑了我的答案以包含一个vector/tuple 示例。 非常感谢 Syam。非常高兴您提供了一个可用的示例,我可以进一步扩展。欣赏它。 if (std::get(*i) > 0 && std::get(*i) 这对我来说是非常有用的语法之一,因为我无法得到我的早点处理这口井。【参考方案2】:

应该这样做,唯一使用的内存是用于 c1 和此 c1 的有效 c2/c3 的计数:

#include <iostream>
#include <map>

using namespace std;

int main()

    int a,b,c = 0;
    map<int, int> n;
    int i;

    for( i = 0 ; i < 6 ; i ++ )
    
        cout << "Enter three numbers separated by space" << endl;
        cin >> a >> b >> c;
        if( b > 0 &&  c < 4 )
            n[a] += 1;
    

    for( auto iter = n.begin(); iter != n.end() ; ++iter )
        cout << iter->first << " " << iter->second << endl;

    return 1;

给予

3 1
4 1
5 1

请注意,您的示例不适用于 c1=4,因为 4.2.4 在 c3 规则上失败。

【讨论】:

谢谢 elvena。然而,这个解决方案看起来不像是一个可行的解决方案,因为所有这些行都必须通过某种方式存储在一个容器中。谢谢。

以上是关于在 c++ 中寻找可枚举的适当容器/函数的主要内容,如果未能解决你的问题,请参考以下文章

C++学习-vector容器构造函数以及赋值

函数返回迭代器以构造 STL 容器

STL 容器中的 const 指针

在 C++ 中抽象容器

FFMPEG 如何将 MJPEG 编码数据复用到 mp4 或 avi 容器 c++

C++ map容器(键值对)