容器初始化方式?

时间:2015-04-09 11:24:10

标签: c++ initialization containers

我的编译器不支持 C ++ 11

事实证明,没有简单的方法来初始化标准库容器的元素。例如,如果要初始化字符串向量,通常会使用一系列push_back()调用,如下所示:

// file.h 
void init_input_tbl(vector<string>& tbl){
tbl.push_back("jan");
tbl.push_back("feb");
tbl.push_back("mar");
tbl.push_back("apr");
tbl.push_back("may");
tbl.push_back("jun");
tbl.push_back("jul");
tbl.push_back("aug");
tbl.push_back("sep");
tbl.push_back("oct");
tbl.push_back("nov");
tbl.push_back("dec");}

vector<string>month_input_tb  

// file.cpp
main(){
init_input_tbl(month_input_tb);
//...

Q1。还有另一种在C ++ 03中初始化容器的方法吗?

除了尝试初始化时,在头文件或全局环境中使用函数init_input_tbl(),它还会显示以下错误:this declaration has no storage class or type specifier

Q2。在month_input_tb内或全球环境中使用init_input_tbl()初始化向量file.h的方法或技术是什么?

4 个答案:

答案 0 :(得分:2)

全局的替代方法是创建一个返回要在初始化中使用的值的函数:

std::vector<std::string> month_inputs();
std::vector<std::string> month_input_tb = month_inputs();

然后在cpp(或标题中,如果你使这个内联)你可以定义函数:

std::vector<std::string> month_inputs() {
    std::vector<std::string> result;
    result.push_back(...);
    ...
    return result;
}

如果你可以引入一些额外的依赖关系,你可以使用提供此类功能的boost assign:

std::vector<std::string> month_inputs_tb = list_of<std::string>()("One")("Two");

答案 1 :(得分:2)

首先,在标题中声明一个全局变量,没有static或者一个类,这是一个坏主意。如果标头包含在多个.cpp文件中,那么您将遇到编译器问题。

问题的一个解决方案是使用 Singleton Pattern 。具有静态变量的类,该函数可在第一次调用函数时初始化。

David Rodriguez的解决方案也有效,但您可以依赖于只能包含在一个源文件中的头文件的问题。但如果你这样做:

//utils.h

struct utils {
    static std::vector months_inputs_tb;
};
//utils.cpp
#include "utils.h"

std::vector month_inputs() {
    ...
}

utils::months_inputs_tb = month_inputs();
//code.cpp
#include "utils.h"


//use utils::months_input as you want

然后,您可以在多个months_inputs_tb文件中自由添加包含.cpp的标头。

答案 2 :(得分:1)

如果要避免在主cpp文件中进行任何类型的初始化,最好的选择是使用编译器特定的库init /构造函数,如MSVC中的DllMain或g ++中的__attribute__((constructor))。我相信在c ++程序范围内对静态类成员的初始化顺序没有任何保证。

E.g。克++:

#include <vector>
#include <string>
#include <iostream>

using namespace std;

__attribute__((init_priority(1000)))
vector<string> myvect;

__attribute__((constructor(1001)))
void myvectinit() {
   myvect.push_back("abc");
   myvect.push_back("def");
   myvect.push_back("ghi");
}

int main() {
   cout << myvect.size() << endl; // output: 3
   return 0;
}

答案 3 :(得分:1)

我假设您的目标只是初始化复杂对象的便捷方式,例如vector s。 (我不明白为什么你关心代码的位置,头文件和cpp文件)。

有了这个助手:

template<size_t N, typename T>
vector<T> construct_vector(const T (&init)[N]) { 
    vector<T> tbl;
    for(size_t i=0; i<N; ++i) { 
        tbl.push_back( init[i] );
    } 
    return tbl;
}

你可以像这样构建你的矢量:

vector<string> month_input_tb = construct_vector((string[]) {"jan","feb"
         ,"mar","apr","may","jun","jul","aug","sep","oct","nov","dec"});

这是有效的,因为您只是使用string。更复杂的物体矢量可能更难。