如何在std :: vector中存储固定长度的字符串

时间:2011-08-17 21:30:53

标签: c++ stdvector

我想模仿一个结构:

char [][40] = { "Stack", "Overflow", "Exchange", "Network" };

使用std::vector,因此我可以在运行时填充它并动态更改vector的大小,但保持成员元素位于固定大小的块内。

静态初始化不是我的问题 - 我可以使用boost::assign或其他技巧来做到这一点。

4 个答案:

答案 0 :(得分:2)

我使用类似Boost.Array的内容:

typedef boost::array<char, 40> arr_t;
std::vector<arr_t> vec;
{
    arr_t arr = { "Stack" };
    vec.push_back(arr);
}
{
    arr_t arr = { "Overflow" };
    vec.push_back(arr);
}
{
    arr_t arr = { "Exchange" };
    vec.push_back(arr);
}
{
    arr_t arr = { "Network" };
    vec.push_back(arr);
}

如果您使用的是合理的最新编译器,而不是Boost,您可以使用std::array<>(C ++ 11; #include <array>)或std::tr1::array<>(C ++ 03与TR1) ; #include <array>#include <tr1/array>,具体取决于平台。)

答案 1 :(得分:1)

struct fixed_string { 
    char data[40];

    fixed_string(char const *init);
};

std::vector<fixed_string> whatever;

如果您有C ++ 11(或至少TR1),您可能希望使用std::array而不是fixed_string。我认为Boost也有同等效力。

如果有人想知道为什么我把它放在struct中,而不是直接创建数组向量:因为vector中的项需要是可复制和可分配的,而裸数组既不是

答案 2 :(得分:0)

vector可能vector有帮助。这里的大小是固定的,字符串可以在纯C中使用。

vector< vector<char> > vector_of_strings;

// Add new string
vector_of_strings.push_back( vector<char>(40) );
// use the string
strcpy( &vector_of_strings[0][0], "text" );

答案 3 :(得分:0)

Parapura的回答是正确的,但你将存储指向字符串的指针。如果原始字符数组超出范围,您将丢失已发布的信息。如果在其他地方使用此向量,它应该分配(并解除分配!)它自己的内存。这可以在输入时完成。

以下是一个示例程序。

#include <vector>
#include <iostream>
using std::cout;
using std::cin;
using std::endl;
using std::vector;

int main()
{
    int numEntries = 4;
    const int strlen = 40;

    // Parapura's correct answer, but let's expand this further
    vector<char*> strvec;
    char* input = 0;
    int i;

    cout << "Enter four names." << endl;
    for (i=0; i<numEntries; i++)
    {
        // Allocate some memory to store in the vector
        input = new char[strlen];
        cout << "Name: ";
        cin.get(input, strlen);
        cin.ignore(strlen, '\n');

        // Push the populated memory into the vector.
        // Now we can let 'input' fall out of scope.
        strvec.push_back(input);
    }
    cout << endl;

    /* -- cool code here! -- */

    cout << "List of names." << endl;
    for (i=0; i<numEntries; i++)
    {
        cout << strvec[i] << endl;
    }

    /* -- more cool code! -- */

    // don't forget to clean up!
    for (i=0; i<numEntries; i++)
    {
        delete[] strvec[i];
    }

    return 0;
}