Cython: невозможно присвоить 2d вектору - PullRequest
0 голосов
/ 19 июня 2020

У меня есть следующее:

# distutils: language = c++
from libcpp.vector cimport vector

def foo():
    cdef vector[vector[int]] matrix 
    matrix.reserve(100);
    matrix[0] = [1,2,3]
    print(matrix)
foo()

Он распечатывает пустой список; Я ожидал, что он распечатает вектор с первым элементом [1,2,3].

Скрипт Setup.py:

from setuptools import setup
from Cython.Build import cythonize

setup(
    name='myfile',
    ext_modules=cythonize("my_file.pyx"),
    zip_safe=False,
)

Как это исправить?

1 Ответ

2 голосов
/ 19 июня 2020

Вы должны использовать matrix.resize(100), а не matrix.reserve(100). std::vector<>::reserve не изменяет размер вектора - он только резервирует память, поэтому никаких дополнительных (множественных) перераспределений не требуется:

%%cython
...
matrix.reserve(100)
print(matrix.size())  # prints 0
matrix.resize(100)
print(matrix.size())  # prints 100
...

Прямо сейчас matrix[0] = [1,2,3] является неопределенным поведением (размер 0 - элементов нет) и вам не повезло, что sh не трескается из-за доступа вне диапазона.

...