我想模仿一个结构:
char [][40] = { "Stack", "Overflow", "Exchange", "Network" };
使用std::vector
,因此我可以在运行时填充它并动态更改vector
的大小,但保持成员元素位于固定大小的块内。
静态初始化不是我的问题 - 我可以使用boost::assign
或其他技巧来做到这一点。
答案 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;
}