Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何索引到C++;共享\u ptr/唯一\u ptr阵列?_C++_Arrays_C++11_Shared Ptr_Unique Ptr - Fatal编程技术网

C++ 如何索引到C++;共享\u ptr/唯一\u ptr阵列?

C++ 如何索引到C++;共享\u ptr/唯一\u ptr阵列?,c++,arrays,c++11,shared-ptr,unique-ptr,C++,Arrays,C++11,Shared Ptr,Unique Ptr,灵感来自 我有前两行要做: std::shared_ptr<string> sp( new string[3], []( string *p ) { delete[] p; } ); *sp = "john"; auto p = &(* sp); ++p = new string("Paul"); ++p = new string("Mary"); for(auto q = &(*sp); q <= p; q++) cout << *q <&l

灵感来自

我有前两行要做:

std::shared_ptr<string> sp( new string[3], []( string *p ) { delete[] p; } );
*sp = "john";
auto p = &(* sp);
++p = new string("Paul");
++p = new string("Mary");
for(auto q = &(*sp); q <= p; q++) cout << *q << endl;
(2) 有没有一种方法可以打印阵列而不必将长度硬编码为常量?我希望有一种方法来实现新的C++循环语法,但是它只出现在 STD::数组< /COD>和 STD::vector < /C> > /< (3) 是否有更简单的方法初始化此数组?也许有一个初始化列表

<>如何将索引分为C++ >代码> SyddYPPT/<代码> />代码> UnQuyPPTR <代码>数组> < /P> 您已经显示了
unique\u ptr
的代码

std::shared_ptr<string> sp( new string[3], []( string *p ) { delete[] p; } );
sp.get()[0] = "string 1";
sp.get()[1] = "string 2";
sp.get()[2] = "string 3";
这适用于
共享\u ptr

std::shared_ptr<string> sp( new string[3], []( string *p ) { delete[] p; } );
sp.get()[0] = "string 1";
sp.get()[1] = "string 2";
sp.get()[2] = "string 3";
std::shared_ptr sp(新字符串[3],](字符串*p){delete[]p;});
sp.get()[0]=“字符串1”;
sp.get()[1]=“字符串2”;
sp.get()[2]=“字符串3”;

要访问后续元素,请使用成员函数

std::shared_ptr<string> sp( new string[3], std::default_delete<string[]>() );
sp.get()[0] = "John";
sp.get()[1] = "Paul";
sp.get()[2] = "Mary";
for(auto q = sp.get(); q < sp.get() + 3; q++) cout << *q << endl;

至于
unique\u ptr
,正如您所注意到的,存在一个可以正确删除数组类型的部分专门化。但是,它不存储数组的长度,您需要单独存储它,并将其与
unique\u ptr
一起传递。对于单行初始化,可以使用与上面相同的语法

std::unique_ptr<string[]> up( new string[len]{"John", "Paul", "Mary"} );
std::unique_ptr up(新字符串[len]{“John”、“Paul”、“Mary”});
但是,
shared_ptr
unique_ptr
都不能用于基于范围的for循环。的范围的定义要求操作数为数组,或者必须具有
begin()
end()
成员函数,或者必须分别使用表达式
begin(\uu范围)
end(\uu范围)
来获取范围的开始迭代器和结束迭代器。包含数组的
shared_ptr
unique_ptr
均不满足这些条件



除非您有充分的理由不这样做,否则您应该只使用
std::vector
,这样可以省去单独跟踪数组长度的麻烦<如果您在编译时知道数组的长度,那么code>std::array>也是另一个选项。

使用C++17,为
shared\u ptr
()定义了
操作符[]
。在此之前,它是为
唯一的\u ptr
,而不是为
共享的\u ptr

std::shared_ptr<string> sp( new string[3], []( string *p ) { delete[] p; } );
sp.get()[0] = "string 1";
sp.get()[1] = "string 2";
sp.get()[2] = "string 3";
因此,下面的代码将起作用

std::shared_ptr<string[]> sp(new string[3]);
    sp[0] = "John";
    sp[1] = "Paul";
    sp[2] = "Mary";

    for(int i =0; i< 3; i++)
    {
        cout<<sp[i]<<"\n";
    }
std::shared_ptr sp(新字符串[3]);
sp[0]=“约翰”;
sp[1]=“保罗”;
sp[2]=“玛丽”;
对于(int i=0;i<3;i++)
{

++p=newstring(“Mary”)之后,简单地使用
std::vector
,怎么样;
p
指向新分配的字符串,与
sp
持有的内存没有任何关系。然后,您的
for
循环通过比较不相关的指针来显示未定义的行为。您可能指的是类似
*(++p)=“Paul”
您可以简单地执行
sp.get()[0]
sp.get()[1] 
等等。