英文:
C++ Fill a vector in a namespace
问题
以下是对Python代码的C++翻译:
foo.h
#ifndef FOO_H
#define FOO_H
#include <vector>
#include <string>
#include "consts.h"
namespace bar {
extern std::vector<std::string> table;
std::string UseTable(int index);
} // namespace bar
#endif // FOO_H
foo.cc
#include "foo.h"
#include "consts.h"
namespace bar {
std::vector<std::string> table(consts::size_of_table, "");
std::string UseTable(int index) {
return table[index];
}
} // namespace bar
这个C++代码保留了Python代码的功能,包括初始化表并提供使用表的功能。 C++中的table
是在foo.cc
中定义的全局std::vector
,并在foo.h
中声明为extern
,以便在其他源文件中使用。 UseTable
函数提供了与Python代码中的use_table
相似的功能。 你不需要构造函数或初始化钩子,因为全局table
在程序启动时初始化。
如果需要在不同源文件中使用table
,确保在这些文件中包括foo.h
并链接foo.cc
。
英文:
I am trying to port the following Python code to 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]
It initializes one time a table with the size taken from the settings. Then the table is filled up with values in a for
loop. use_table
is a simplified function which consumes the table.
Here is my attempt in 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];
}
The problem
As far as I know, in C++ the for
loop must be in a function. I could make a function to fill up the vector, but when should I call it? Namespaces do not have a constructor, or initialization hooks.
What would be the equivalent architect to the original Python code?
答案1
得分: 3
你在想要初始化向量时调用该函数。
你可以使用 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();
英文:
You call the function when you want to initialize the vector.
You can use a lambda function,
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;
}();
or a named function,
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();
答案2
得分: 0
你可以在程序的 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)];
}
/* 或者:
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 ...;
}
std::string bar::UseTable(int index)
{
return table[index];
}
main.cpp
#include "foo.h"
int main()
{
bar::InitTable();
// 根据需要使用表格...
return 0;
}
希望这对你有所帮助。
英文:
You can do the initialization in your program's main()
function, eg:
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;
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论