Not*_*ist 4 c++ stl visual-studio-2010
该cppreference页说,有关std::basic_string::swap
它具有恒定的复杂性.我认为这意味着不能发生复制内容,只能交换指针或类似内容.我写了一个测试代码并且经历过它确实在VS2010下移动了内容.测试代码:
std::string s1("almafa");
std::string s2("kortefa");
std::cout << "s1.c_str(): "<< (void*)s1.c_str() << std::endl;
std::cout << "s2.c_str(): "<< (void*)s2.c_str() << std::endl;
std::cout << "SWAP!" << std::endl;
s1.swap(s2);
std::cout << "s1.c_str(): "<< (void*)s1.c_str() << std::endl;
std::cout << "s2.c_str(): "<< (void*)s2.c_str() << std::endl;
Run Code Online (Sandbox Code Playgroud)
g ++ 4.6.3上的输出
s1.c_str(): 0x22fe028
s2.c_str(): 0x22fe058
SWAP!
s1.c_str(): 0x22fe058
s2.c_str(): 0x22fe028
Run Code Online (Sandbox Code Playgroud)
VS2010的输出
s1.c_str(): 000000000022E2D0
s2.c_str(): 000000000022E320
SWAP!
s1.c_str(): 000000000022E2D0
s2.c_str(): 000000000022E320
Run Code Online (Sandbox Code Playgroud)
它是标准的分歧还是我不知道的事情发生了?
一些实现std::string
使用短字符串优化:
"短字符串优化"(SSO)实现.在此变体中,对象包含通常指向数据,长度,动态分配缓冲区大小等的指针.但是如果字符串足够短,它将使用该区域来保存字符串而不是动态分配缓冲区.
所以你的情况下的交换是复制但是固定大小,所以O(1).