C++在命名空间中填充向量

pgpifvop  于 2023-03-25  发布在  其他
关注(0)|答案(2)|浏览(144)

我正在尝试将以下Python代码移植到C++:

  • foo.py*
import settings.consts as consts

table = [""] * consts.table_size
for idx in range(0, consts.table_size):
    str = consts.lookup[get_by_index(idx)]
    table[idx] = str

def use_table(index):
    return table[index]

它初始化一次表的大小从设置中获得。然后在for循环中用值填充表。use_table是一个简化的函数,它消耗表。
以下是我在C++中的尝试:

  • foo.h*
#ifndef FOO_H
#define FOO_H

#include <vector>
#include <string>
#include "consts.h"

namespace bar {

    std::vector<std::string> table(consts::size_of_table, "");
    int GetByIndex(int a);
    string UseTableable(int index);

} // namespace bar

#endif // FOO_H
  • foo.cc*
string UseTableable(int index)
{
  return table[index];
}

问题是

据我所知,在C++中,for循环必须在一个函数中。我可以创建一个函数来填充向量,但是我应该什么时候调用它呢?命名空间没有构造函数,也没有初始化钩子。
与原始Python代码等效的架构师是什么?

kpbwa7wx

kpbwa7wx1#

当您要初始化向量时,可以呼叫函式。
你可以使用lambda函数

std::vector<std::string> table = 
    [](){
            std::vector<std::string> tbl(consts::size_of_table, "");
            for (size_t i = 0; i < tbl.size(); i++) {
                tbl[i] = consts::lookup[GetByIndex(i)];
            }
            return tbl;
    }();

或命名函数,

std::vector<std::string> make_table()
{
    std::vector<std::string> tbl(consts::size_of_table, "");
    for (size_t i = 0; i < tbl.size(); i++) {
        tbl[i] = consts::lookup[GetByIndex(i)];
    }
    return tbl;
}

std::vector<std::string> table = make_table();
kcugc4gi

kcugc4gi2#

你可以在程序的main()函数中进行初始化,例如:
foo.h

#ifndef FOO_H
#define FOO_H

#include <vector>
#include <string>

namespace bar {

    extern std::vector<std::string> table;

    void InitTable();
    int GetByIndex(int a);
    std::string UseTable(int index);

} // namespace bar

#endif // FOO_H

foo.cpp

#include "foo.h"
#include "consts.h"

std::vector<std::string> bar::table;

void bar::InitTable()
{
    table.resize(consts::size_of_table, "");
    for(int idx = 0; idx < consts::size_of_table; ++idx) {
        table[idx] = consts::lookup[GetByIndex(idx)];
    }

    /* alternatively:
    table.reserve(consts::size_of_table);
    for(int idx = 0; idx < consts::size_of_table; ++idx) {
        table.push_back(consts::lookup[GetByIndex(idx)]);
    }
    */
}

int bar::GetByIndex(int a)
{
    return ...;
}

string bar::UseTable(int index)
{
  return table[index];
}

main.cpp

#include "foo.h"

int main()
{
    bar::InitTable();
    // use table as needed...
    return 0;
}

相关问题