我想用這樣的字符數組:的初始化已經宣佈C++
char theArray[]=new char[8];
theArray= { 1,2,3,4,5,6,7,8};
代替
char theArray[] = { 1,2,3,4,5,6,7,8};
是類似的事情可能嗎?
我想用這樣的字符數組:的初始化已經宣佈C++
char theArray[]=new char[8];
theArray= { 1,2,3,4,5,6,7,8};
代替
char theArray[] = { 1,2,3,4,5,6,7,8};
是類似的事情可能嗎?
的C++ 0x
char* ch;
ch = new char[8]{1, 2, 3, 4, 5, 6, 7, 8};
@大衛索恩利:然後切換這些行並沒有問題。認真你談論在相同的存儲池作爲前值重新分配char[8]
,那麼你需要用自己的分配器,像玩:
char* ch1 = new char[8]{'a', 'b', 'c', 'd', 'e', 'f', 'g', 'i'};
char* ch2 = new(ch1) char[8]{1, 2, 3, 4, 5, 6, 7, 8};
AFAIK OP不太可能需要這一點。
爲什麼不在一條線上? – 2010-09-27 15:55:03
@Nemanja Trifunovic:不知道,問OP,因爲這是他要聲明和初始化分開:) – erjot 2010-09-27 16:03:13
這並沒有解決確切的問題,因爲'新'是在OP的例子中的第一行,第二個在你的。 – 2010-09-27 17:44:22
這是可怕的,我知道,但也將在這種情況下工作:
memcpy(theArray, "\x01\x02\x03\x04\x05\x06\x07\x08", sizeof(theArray));
char theArrayCopy[] = { 1,2,3,4,5,6,7,8};
//
//
char* theArray=new char[sizeof(theArrayCopy)];
// or
char theArray[sizeof(theArrayCopy)];
memcpy(theArray, theArrayCopy, sizeof(theArrayCopy));
我推薦'std :: copy'(並且基本上從不使用低級別)操作符,但是否則我會這樣做。 – 2010-09-27 16:25:18
注:我知道這是不是答案原來的問題,但我認爲這是正確的要做的事情,所以我把它在這裏作爲CW後...
你可以概括它有點太多,如果你想...
class IntegerSequenceGenerator
{
int step_;
int value_;
public:
IntegerSequenceGenerator(int start = 0, int step = 1)
: step_(step), value_(start) {}
int operator()() {
int result = value_ + step_;
std::swap(result, value_);
return result;
}
};
用途:
int main() {
std::vector<int> myArray;
std::generate_n(std::back_inserter(myArray), 8, IntegerSequenceGenerator());
}
或者:
int main() {
std::vector<int> myArray(8);
std::generate(myArray.begin(), myArray.end(), IntegerSequenceGenerator());
}
或:
int main() {
int myArray[8];
std::generate(myArray, myArray + (sizeof(myArray)/sizeof(int)), IntegerSequenceGenerator());
}
一種可能性,你可能需要使用升壓分配,在那裏你可以使用這樣的考慮:
std::vector<int> v;
v += 1, 2, 3, 4, 5, 6, 7, 8;
這不起作用雖然它不一定是矢量,但它確實需要某種集合類,而不是內置類型。 OTOH,如果沒有一些極其的具體原因,否則,你可能想要使用一個集合。
對於實際的數組,程序將生成1到8的值,然後將8添加到數組的起始地址,並且什麼也不做。但是,如果你打開了優化,它可能會完全跳過它,因爲它什麼都不做。這可以用於矢量的唯一可能的方式是運算符重載,它需要實際的類,而不是基本的類型或數組。 – 2010-09-27 17:46:33
@大衛:是的 - 我其實並沒有真正想過,但現在你提到它了,我應該知道得更清楚,只是說它不起作用。我應該記住一個重載操作符需要一個UDT作爲至少一個操作數。 – 2010-09-27 18:03:51
有一個問題,其他答案沒有解決。 (雖然有幾個解決它。)
這地方char[8]
類型的數組在棧上:
char theArray[] = { 1,2,3,4,5,6,7,8};
這地方就在堆(實際上它是非法的,但我會假設你的編譯器接受它):
char theArray[]=new char[8];
假如你真的不希望它在堆上,而只是希望對其進行初始化,這將工作:
char theArray[max_array_size]; // need to specify size to place on stack
/* code */
static const char theInitializer[] = { 1,2,3,4,5,6,7,8};
std::copy(theInitializer, theInitializer + sizeof theInitializer, theArray);
使用'std :: vector',不要手動管理資源。 – GManNickG 2010-09-27 17:55:20
你想達到什麼目的?靜態初始化動態分配的數組? – 2010-09-27 18:18:13