【问题标题】:What is the type of a vector that stores a vector of one function and one vector of std::string存储一个函数向量和一个 std::string 向量的向量是什么类型
【发布时间】:2021-12-26 01:55:40
【问题描述】:

我现在正想弄清楚一件事,但我做不到,我需要为此找到一个类型

(蟒蛇)

def fn1(hello: list[str]) -> None:
    pass

mv = [(fn1, ("1", "hello", "12", "no")), (fn1, ("w", "ufewef", "1ee", "no"))]  # any size

mv 的 C++ 类型是什么? (不管它是否可变)

我试过std::vector<std::vector<std::string, std::function>>,但它会抛出一个错误,有没有办法做到这一点,或者必须使用两个向量?

【问题讨论】:

  • 我认为你需要一个结构向量。并定义你自己的结构,比如 struct my_data { std::function fn;标准::字符串 str1; ... std::string str4; }; (然后给 fn, str1, ... str4 赋予有意义的名称
  • @Pepijn Kramer 谢谢,我会试试 :)
  • 缺少一些括号。您可能在这两个地方都指的是"no"))
  • @aschepler 是的,对不起
  • using MyFunction = void(const std::vector<std::string>&); using MyDataStructure = std::vector<std::pair<MyFunction*, std::vector<std::string>>>; 或使用std::function<MyFunction> 代替MyFunction* 是否需要表示除普通函数指针之外的可调用对象。

标签: c++ string function vector


【解决方案1】:

这些类型变得复杂,所以为了使它们更短,我将首先定义几个类型别名:

using StringVec = std::vector<std::string>;
using StringVecFunc = std::function<void(const StringVec&)>;

现在您的数据容器的类型可以是以下任何一种:

using T1 = std::vector<std::tuple<StringVecFunc, StringVec>>;

using T2 = std::vector<std::pair<StringVecFunc, StringVec>>;

struct StringVecFuncAndArgs {
    StringVecFunc func;
    StringVec args;
};
using T3 = std::vector<StringVecFuncAndArgs>;

最大的区别在于您如何访问包含一个函数和一个字符串容器的事物的元素(如 python 元组)。对于std::tuple,您使用std::get&lt;0&gt;(t)std::get&lt;1&gt;(t)std::get&lt;StringVecFunc&gt;(t)std::get&lt;StringVec&gt;(t)。对于std::pair,您使用p.firstp.second。对于自定义结构,您使用 data.funcdata.args

tuple 解决方案可能是对 Python 元组概念的最直接转化。如果不需要从大量代码中使用pair,它既快速又简单。自定义 struct 解决方案的工作量最大,但可以让您为成员提供有用的名称。

【讨论】:

    【解决方案2】:

      我的程序使用了一个 stringVec struct,它声明了一个 vector&lt;string&gt; hello 和一个返回 void stringVecFunc 的函数,用作打印值的示例hello.

    struct stringVec {
        vector<string> hello;
        void stringVecFunc();
    };
    
    void stringVec::stringVecFunc() {
        for (auto &x: hello) cout << x << "\t";
        cout << endl;
    }
    

     在这之后,一个vector负责存储stringVec类型的数据,通过这种方式:

    stringVec stringVec1;
    stringVec1.hello = {"hi", "hello", "hi", "hello"};
    
    vector<stringVec> vec;
    

    你可以运行一个完整的例子here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-18
      • 1970-01-01
      • 2022-01-15
      • 1970-01-01
      • 2021-12-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多