我正在尝试用C++创建一个"稀疏"矢量类,如下所示:
template<typename V, V Default>
class SparseVector {
...
}
Run Code Online (Sandbox Code Playgroud)
在内部,它将由a表示std::map<int, V>(其中V存储的值的类型).如果地图中不存在元素,我们将假装它等于Default模板参数中的值.
但是,我在重载下标运算符时遇到问题[].我必须重载[]操作符,因为我将此类中的对象传递给期望[]正常工作的Boost函数.
该const版本是很简单的:检查索引是否在地图上,它的返回值,如果是这样,或者Default以其他方式.
但是,非const版本要求我返回一个引用,这就是我遇到麻烦的地方.如果只读取值,我不需要(也不想)向地图添加任何内容; 但如果正在编写,我可能需要在地图中添加一个新条目.问题是重载[]不知道是读取还是写入值.它只返回一个引用.
有什么方法可以解决这个问题吗?或者也许要解决它?
引用C11标准:
阵列子装(第6.5.2.1节)
下标操作符的定义
[]是E1[E2]相同(*((E1)+(E2))).
我想知道为什么围绕E1必要的括号(它们在C89标准中缺失),即哪个表达式可以(*(E1+(E2)))不同(*((E1)+(E2)))?
我想问一下为什么我在初始化例如矢量或其他类型的列表时会出现此错误,我该如何解决?
> l <- list()
> l[[1]][1] <- 1
Error in `*tmp*`[[1]] : subscript out of bounds
Run Code Online (Sandbox Code Playgroud)
这是我需要的整个代码,实际上我想要一个这样的向量列表:
mcorrelation <- list()
for(k in 1:7){
for (ind in 1:7){
mcorrelation[[k]][ind] <- co$estimate
}
}
Run Code Online (Sandbox Code Playgroud)
我应该提前初始化整个列表还是有其他方法可以避免出现此错误?
当我在这个例子中使用char数组下标时:
int main(){
char pos=0;
int array[100]={};
for(pos=0;pos<100;pos++)
printf("%i\n", array[pos]);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我收到警告,我正在使用char数组下标:
警告:数组下标的类型为'char'[-Wchar-subscripts]
哪个好,因为我启用了此警告.
GCC手册说:
-Wchar-subscripts如果数组下标的类型为"char",则发出警告.这是导致错误的常见原因,因为程序员经常忘记这种类型是在某些机器上签名的.-Wall启用此警告.
因此,此警告应防止使用负数组索引.我的问题是,为什么此警告仅在char上有效,而在其他已签名类型上无效?
谢谢.
这是我的第一个问题,我是 python 菜鸟。所以可能还会有更多后续......
我想用 matplotlib 创建一个图形。在标签中,我想包含一个化学式,其中涉及下标(我认为同样适用于上标......)。
无论如何,我不知道标签应该是什么样子。
import numpy as nu
import pylab as plt
x = nu.array([1,2,3,4])
y = nu.array([1,2,3,4])
plt.plot(x,y, label='H2O')
plt.legend(loc=1)
plt.show()
Run Code Online (Sandbox Code Playgroud)
好的,这给了我一个带有标签“H2O”的图。如何在标签中添加下标“2”(这在化学式中很常见)?
我在网上搜索,但还没有找到任何有用的东西。
我想我可以用
from matplotlib import rc
rc['text', usetex=True]
Run Code Online (Sandbox Code Playgroud)
但我不想使用它(我知道如何使用LaTeX,但我不想在这里)。
另一种选择是:
label='H$_2$O'
Run Code Online (Sandbox Code Playgroud)
但这会改变字体(数学)。
一定有办法,matplotlib-legends 中的下标如何工作?
多谢!
我有一个重载下标运算符的类:
class SomeClass
{
public:
int& operator[] (const int idx)
{
return someArray[idx];
}
private:
int someArray[10];
};
Run Code Online (Sandbox Code Playgroud)
这当然允许我像这样访问someArray成员的数组元素:
SomeClass c;
int x = c[0];
Run Code Online (Sandbox Code Playgroud)
但是,SomeClass的某些实例将包含在boost共享指针中:
boost::shared_ptr<SomeClass> p(new SomeClass);
Run Code Online (Sandbox Code Playgroud)
但是,为了使用下标运算符,我必须使用更详细的语法,这种语法会破坏下标运算符重载的简洁性:
int x = p->operator[](0);
Run Code Online (Sandbox Code Playgroud)
有没有办法以更简单的方式访问下标运算符?
在...的脉络中
@implementation MyClass
- (id) objectForKeyedSubscript:(id)k {
return [self something:k];
}
Run Code Online (Sandbox Code Playgroud)
是否也可以“下标”Class对象?我也即将和你一起发现......但我想我会在测试时发布这个问题,我自己......
+ (id) objectForKeyedSubscript:(id)k {
return [self.shared something:k];
}
Run Code Online (Sandbox Code Playgroud)
唉……这不是……
id x = MyClass[@"document"];
Run Code Online (Sandbox Code Playgroud)
错误:意外的接口名称“MyClass”:预期的表达式
但是为什么,爸爸? Class“肯定得短端的NSObject球棍,如果你问我。
我正在尝试安排ggplot2使用该gridExtra包生成的一些图.
library(ggplot2)
library(gridExtra)
p1 <- ggplot(iris, aes(Sepal.Length, Sepal.Width)) + geom_point()
p2 <- ggplot(iris, aes(Sepal.Length, Petal.Length)) + geom_point()
p3 <- ggplot(iris, aes(Species, Sepal.Width)) + geom_point()
p4 <- ggplot(iris, aes(Sepal.Width, Petal.Width)) + geom_point()
grid.arrange(main="CO2Exp", p1, p2, p3, p4, ncol=2)
Run Code Online (Sandbox Code Playgroud)
当我尝试拥有一个主标题时,后续工作正常.
grid.arrange(main="CO2Exp", p1, p2, p3, p4, ncol=2)
Run Code Online (Sandbox Code Playgroud)
但是当我尝试expression获取下标时,
grid.arrange(main=expression(paste(CO[2], "Exp")), p1, p2, p3, p4, ncol=2)
Run Code Online (Sandbox Code Playgroud)
我收到以下错误
Error in valid.data(rep(units, length.out = length(x)), data) :
no 'grob' supplied for 'grobwidth/height' unit
Run Code Online (Sandbox Code Playgroud)
如何解决这个问题?
我正在使用R_3.1.3,gridExtra_0.9.1和ggplot2 …
我有两种编写相同代码的方法,其中一种似乎不受Swift编译器的影响.你能解释一下原因吗?
语境:
let guaranteedValue: String
let cursorPositionFromEnd: Int
Run Code Online (Sandbox Code Playgroud)
工作代码:
let stringFromEndUntilCursorPosition = String(guaranteedValue.reversed()[0..<cursorPositionFromEnd])
Run Code Online (Sandbox Code Playgroud)
非工作代码:
let reversedOriginalString = guaranteedValue.reversed()
let stringFromEndUntilCursorPosition = String(reversedOriginalString[0..<cursorPositionFromEnd])
Run Code Online (Sandbox Code Playgroud)
编译器错误消息:"无法ReversedCollection<String>使用索引类型下标类型的值Range<Int>"
其他工作尝试:
let reversedOriginalString = guaranteedValue.reversed()[0..< cursorPositionFromEnd]
let stringFromEndUntilCursorPosition = String(reversedOriginalString)
Run Code Online (Sandbox Code Playgroud)
基本上这个想法是你只能下一个反转范围{但可能不仅仅}如果你在函数返回时添加索引,但是如果你首先用let或var引用变量然后尝试下标它就不行.
我也明白,如果Range是String.Index类型或者其他任何新方式,它可能会在"非工作代码"中起作用.
有谁能解释为什么?这是Swift编译器中的一个错误,它已经有足够的"扭曲"字符串逻辑吗?
假设我有一个矢量类:
typedef struct vec3_s
{
float x, y, z;
}
vec3;
Run Code Online (Sandbox Code Playgroud)
但是,我希望能够迭代它而不将其转换为浮点数组.虽然在这种情况下演员阵容是可以接受的,但我很想知道C++中的任何功能是否都可以在C语言中完成.例如,在C++中,由于std::vector< T >下标[]运算符被重载,我可以传递其地址一个函数的第一个索引void*.
即
void do_something_with_pointer_to_mem( void* mem )
{
// do stuff
}
int main( void )
{
std::vector< float > v;
// fill v with values here
// pass to do_something_with_pointer_to_mem
do_some_with_pointer_to_mem( &v[ 0 ] );
return;
}
Run Code Online (Sandbox Code Playgroud)
另一个更具体的例子是在OpenGL中使用glBufferData(...)时(使用C++时):
glBufferData( GL_ARRAY_BUFFER, sizeof( somevector ), &somevector[ 0 ], GL_STREAM_DRAW );
那么,是否有可能使用下标运算符在C中完成类似的事情?如果没有,并且我必须编写一个函数(例如float vec3_value_at( unsigned int i )),那么static inline …